computer science

[OS] 운영체제 Virtual Memory Management

yjs3819 2021. 9. 19. 11:10
728x90

어떻게 하면 가상메모리를 잘 관리하여 가상메모리 시스템 성능을 '최적화'를 시킬수 있는지 알아보자!

지금부터 말하는 기법은 paging 기법을 토대로 말할것, segmentation도 가상메모리 관리 관련해선 동일하기에..

가상메모리의 Cost model

가상메모리의 성능을 높이기 위한 지표로는 다양한 것이 있지만 그중 가장 대표적인

  • Page fault frequency(발생빈도)
  • Page fault rate(발생률)

두 가지가 존재한다. (address mapping 공부할때, residence bit가 0이면 page fault로 context switching을 통한 높은 오버헤드가 발생하기에 성능에 영향을 크게 미친다고 알고있다.)

즉, 'Page fault'를 최소화 하는 것이 가상메모리의 성능을 최적화할수 있는 중요한 뽀인트이다.

Page fault는, 참조하려는 페이지가 메모리에 페이지 프레임으로 적재되 있지 않은 경우를 의미하고, Page fault가 발생하면 running 상태의 프로세스가 외부 i/o를 입력받아야하므로 할당받은 프로세서를 반납해 asleep(block)상태로 가고 다시 프로세서를 할당받는 context switching이 발생하기에 오버헤드가 크다. 이는 시스템 성능에 영향을 크게 미친다.

가상메모리 관리를 위해 알아야할 용어들

Page reference string

프로세스가 수행중 참조한 페이지 번호 순서이다.
w = r1r2...rk..rt

이런식으로 존재하는 문자열이다.

왜 페이지를 참조한 정보를 가지고있는가?

Page fault rate = F(w)

Page fault를 알수 있는 정보이기 때문

Page fault가 발생한 개수 / 프로세스가 참조한 페이지의 개수 = 페이지 fault가 발생률을 알수 있다.

Hardware Component

가상메모리 관리를 위한 하드웨어 요소이다.

Address translation device(주소 사상 장치)

  • adress mapping을 더 효율적으로 하기위해서 TLB(연관사상)를 이용했었다. 이 TLB가 하드웨어 요소이다.

Bit vectors

page 사용 상황에 대해 배열 자료구조에 기록하는 비트들이다. PMT에 존재한다.
왜 필요할까? 메모리에 적재된 page frame들을 효율적으로 관리하기 위해서이다.
효율적으로 관리하기 위해선 page frame들의 정보가 필요한데, 그 정보를 vector에 bit로 기록하는 것이다.

  • Reference bits(used bit)
    참조 비트를 의미한다. (해당 페이지가 참조되면 해당 비트는 1, 아니면 0)
  • Update bits(dirty bits)
    갱신 비트를 의미한다. (해당 페이지가 갱신되면 해당 비트는 1, 아니면 0)

요런식으로 PMT에 bit vectors가 존재한다.(페이징 시스템 기반으로 설명하는 거다.. 세그멘테이션 시스템이라면 SMT에 있겠다!)

Reference bit vector

  • 메모리에 적재된 page frame(page)가 최근에 참조되었는지 기록하기 위해서이다. 최근이라는 단어에 유의하자.
  • 어떤 시점마다 reference bit vector들은 0으로 모두 초기화되고, 참조되면 1로 변경된다. 이는 메모리에 적재된 해당 페이지가 '최근'에 참조되었는지를 기록하기 위해서이다.

    (reference bit vector)

Update bit vector

  • page가 메모리에 적재된 이후 프로세스에 의해 수정이 되었는지를 기록한다. (메모리에 적재된 페이지에 유의하자.)
  • 이는 Write-back때문에 기록하는 것이다.

Write-back이란, 메모리에 적재된 페이지가 수정이되면, swap device의 페이지와 내용이 다르기에 swap device도 변경된 내용이 반영되야한다. 이때 swap-device의 페이지에 변경된 내용을 반영하는 작업을 Write-back이라한다.

  • Update bit vector는 갱신되면 bit를 1로, Write-back(swap-device로 다시 이동)되면 bit가 0으로 변경되므로 reference bit vector보다는 주기적으로 초기화 되지 않는다.

Software Component

가상메모리 성능 향상을 위한 관리 기법들을 의미한다. 무엇, 무엇이 있는지 봐보자.

Allocation Strategies(할당 기법)

각 프로세스에게 메모리를 얼마만큼 줄것인가?의 기법이다.

  • 프로세스가 실행도중 고정된 크기의 메모리를 할당하는 Fixed allocation
  • 프로세스가 실행 동안 할당하는 메모리의 크기가 유동적인 Variable allocation

이 존재한다.

고려해야할 사항으로는

  • 해당프로세스가 실행도중 필요한 메모리의 양을 예측해야 한다.
  • 프로세스가 실제로 필요한 메모리 양보다 더 많은 양을 할당하면 그만큼 메모리가 낭비되고
  • 프로세스가 실제로 필요한 메모리 양보다 적은 양을 할당하면 page fault가 자주 일어나 시스템 성능을 저하한다.

적당한 크기의 메모리를 프로세스에게 할당해야한다.

Fetch Strategies

특정 페이지를 언제 메모리에 적재할것인가?의 기법이다.

  • Demand fetch
    프로세스가 현재 참조하는 페이지만 메모리에 적재하는 기법이다.
  • Anticipatory fetch(pre-fetch)
    참조될 가능성이 높은 페이지를 예측해서 미리 메모리에 적재하는 기법이다.
    물론 예측 성공시 Demand fetch보다 page fault가 적을 것이고, 예측 실패시 Demand fetch보다 page fault가 자주 발생되어, 시스템 성능이 저하될 것이다.
    (Hit ratio에 민감하다.)

대부분의 시스템은 Demand fetch기법을 사용한다. pre-fetch기법을 사용했다가 예측이 실패하면 오버헤드가 더 크기 때문에. 그렇지만 우리가 만든 프로그램은 어떤 방식으로 동작하는지 알기 때문에 예측가능하다. 그렇기에 pre-fetch기법을 통해 곧 사용될 페이지를 미리 메모리에 적재하는 것이 시스템성능 향상을 더 높일 것이다.

Placement Strategies(배치 전략)

page/segment를 어디 부분의 메모리에 적재할 것인가?에 대한 기법이다.
이건 continuous memory allocation - VPM(variable partition Multi programing)에서 release되어 빈 공간인 메모리가 존재할 때 블럭을 어떤 곳에 적재할 것인가에 대한 기법들로 살펴본 적이있다.
(paging system은 page frame과 page들의 크기가 모두 같기 때문에 고민할 필요 없음!)

  • first-fit
  • best-fit
  • worst-fit
  • next-fit

이 존재한다.

자신이 사용하는, 만든 프로그램에 어울리는 배치기법을 골라 사용하면 된다.

Cleaning Strategies

변경된 페이지를 언제 wirte-back 할 것인가?에 대한 기법이다.

write-back이란 변경된 페이지의 내용을 스왑디바이스에 반영하는 것을 의미한다.

  • Demand cleaning
    페이지가 메모리에서 내려올 때 write-back을 하는 기본적인 기법
  • Anticipatory cleaning(pre-cleaning)
    더이상 변경되지 않는 다고 판단된 페이지를 메모리에 내려올때 write-back하는게 아닌 미리 write-back해버리는 예측 기법이다.
    이 기법도 예측이 성공하면 write-back시간을 절약할수 있지만 실패하면 오버헤드가 크다!!(두번 write-back해야 한다.)

대부분의 시스템은 demand cleaning기법을 사용하지만 자신이 만든 프로그램은 해당 페이지가 언제 변경이 일어나지 않는지 알기 때문에 pre-cleaning기법을 통해서 성능향상을 꾀할수 있다!! 는것이 뽀인트

Load Control Strategies

Load란 부하이고, 부하를 조절하는 전략이다. 어떻게?
바로 시스템내 실행가능한 프로세스의 수를 조절함으로써!
즉, 이것을 multi-programming degree라고 한다.

적정수준의 프로세스의 수를 유지시켜야한다.(multi programming degree를 유지시켜야한다.)

  • Plateau(고원)영역으로 유지시켜야한다.
  • multi-programming degree를 적게 유지시키면 시스템 자원을 효율적으로 사용하지 못하는 것이기에 성능이 저하되고
  • multi-programming degree를 많이 유지시키면 자원은 한정적인데 동시에 실행가능한 프로세스의 수가 많아지니 그만큼 page-fault 발생 빈도가 증가하여 성능이 저하된다.

Multi-programming degree에 따른 시스템의 처리량 그래프

주의해서 볼것은, overloaded상황에서는 thrashing이 발생한다는 것이다.
thrashing이란 page fault가 너무 자주 발생하는 현상을 의미한다.
Thrashing(스레싱)! 기억하고 넘억가자

동시에 실행가능한 프로세스의 수를 적당히 유지시켜 Plateau영역으로 유지시켜야한다. 그렇지않고 너무 많은 수의 프로세스를 유지시키게 하면 overloaded상태로 돌입하여 thrashing이 발생한다. 그래서 더욱더 성능이 악화된다.

Replacement Strategies

교체 기법이다. 프로세스에게 할당된 메모리에 이미 모든 페이지프레임들이 적재되어있어, 새로운 페이지가 적재될 곳이 없을 때, 어떤 페이지 프레임을 메모리에서 내리고 새 페이지를 적재할 것인가?
sw device에서의 페이지와 메모리에서의 페이지프레임을 교체하는 여러 기법이 존재한다. 어떠한 기법을 사용하냐에 따라 가상메모리 시스템의 성능을 높일수 있다.

  • Locality

지역성은 너무 우리에게 익숙하다.
왜 지역성이란 단어가 replacement strategies에서 나왔나?
바로 지역성이 replacement strategies중 하나를 고르는데 중요한 뽀인트이기 때문이다.

지역성의 특징으로 메모리에 할당된 일부분의 페이지 프레임만을 계속해서 참조한다.!!
그렇기에 교체할 페이지프레임을 선택하는 것은 지역성을 꼭 생각해야만한다.
그렇지 않으면 자주 사용되는 페이지프레임을 메모리에서 내려서 page fault가 급격하게 증가할수있다.

---> 지역성을 통해 자주 사용되지 않는 페이지프레임을 메모리에서 내려주는것이 뽀인트!@!@!@

이제 replacement strategies들을 하나씩 살펴보자.(fixed allocation)

Min algorithm(최적의 알고리즘)

replacement strategies중 하나로, 앞으로 가장 오랫동안 참조되지 않을 페이지를 교체하는 기법이다.

여기서 드는 의문점 두가지

  1. 그렇다면 어떤 페이지를 참조하는지 미리다 알고있어야겠네?

---> 맞다.. 그래서 not practical하다. Min 알고리즘은 replacement strategies의 성능 평가도구로 사용되기에 그 자체로 유용한 알고리즘이다.

  1. 앞으로 가장 오랫동안 참조되지 않을 페이지를 교체하는 것이 왜 page fault를 줄일수 있는거지?

---> 가장 오랫동안 참조되지 않을 페이지를 교체하는게 아닌 그 앞에 참조된 페이지를 교체하는 것은, page fault가 먼저 발생한다는 것이고, page fault가 먼저 발생했다는 의미는 그 이후에도 page fault가 발생활 확률이 더 높다는 것이기에! 앞으로 가장 오랫동안 참조되지 않을 페이지를 교체하는것이 page fault발생 확률을 낮출수 있다.

Random algorithm

메모리에 적재된 페이지중 하나를 랜덤하게 내려서 새 페이지를 교체하는 기법이다.

이것도 또한 그 자체로는 의미가없다. 그러나 새로운 교체 기법의 평가 기준이 될순있따!!

FIFO algorithm

가장 오래된 page를 교체한다.
그냥 지역성이런거 신경안쓰고 가장 오래된 페이지를 교체하는 기법이다.

지역성을 신경안쓰니 page fault는 더 많이 발생할 수 있다..

  • FIFO anomaly
    FIFO알고리즘의 경우, 페이지프레임의 크기를 더 늘려도 page fault가 더 발생할 수도 있다.

LRU(Least Recently Used) algorithm

지역성특징을 활용하는 알고리즘이다. !!!
참조된지 가장 오래된(사용한지 가장 오래된)페이지를 교체하는 기법이다.

참조될때마다 페이지마다 시간을 기록해야하며, Loop 실행의 경우 필요한 크기보다 적은 page frame이 할당된 경우에 page fault가 급격히 증가할수 있다. 전자는 시간을 기록하지않고, 순서만 기록하여 간단화할수 있고 후자는 page frame크기를 늘려주어 page fault를 줄일수 있다.

계속해서 fixed allocation에서 replacement strategies인 알고리즘들을 확인해보쟈..

LFU(Least Frequently Used) algorithm

자주 사용되지 않은 알고리즘이다.
즉, 가장 참조횟수가 적은 페이지프레임을 내려줘서 교체하는기법이다.
LRU는 계속 참조할때마다 시간을 기록해서 참조된지 오래된 페이지프레임을 내려줘서 교체해야하는데 LFU는 ++로 참조횟수만 1씩 증가하면 되기에 오버헤드가 LRU보단 적다.

  • Locality도 활용한다. 참조횟수가 적은 페이지를 내려주기에.

그러나,

  • 최근 참조된 페이지가 참조횟수가 적다는 이유만으로 바로 교체될수있다. 최근에 참조된 페이지는 또 참조가 될수있는데 말이다!
  • ++로 참조횟수를 기록한다는 것도, 누적되면 큰 수가되므로 어느정도의 오버헤드가 있다.

NUR(Not Used Recently) Algorithm

참조되지 않은 페이지를 내려주는 알고리즘이다.
뭔가 LFU랑 비슷한데?

차이점은 위에서본 hardware component인 bit vector를 이용 한다는 것!!

(r, m)중, r을 reference bit, m을 update bit라 한다면 각 값에대한 교체순서 우선순위를 알아보자.

1순위 : (r, m) = (0, 0) - 참조되지도 않았고 변경도 안돼서 write-back할 필요 없으니 1순위!
2순위 : (r, m) = (0, 1) - 참조되진 않았지만 변경은 됐다. 2순위!
3순위 : (r, m) = (1, 0) - 참조된적은 있지만 변경은 안돼서 write-back할 필요 없다! 3순위!
4순위 : (r, m) = (1, 1) - 참조도 됐고, 변경도 돼서 꼴등!

위 우선순위에 따라서 높은 우선순위의 페이지프레임을 내려줘서 교체하면 된다.

reference bit는 주기적으로 0으로 초기화되는걸 잊지말자!, update bit는 변경되면 1, swap device로 내려갈때 write-back하면서 0으로 초기화 된다!

Clock Algorithm

이론적인 NUR 알고리즘을 실제로 적용해본 알고리즘이다.
'IBM VM/370 OS'에서 사용된 알고리즘임!!

  • reference bit만 사용한다. update bit는 사용하지 않는다.
  • 이상하게 reference bit의 주기적인 초기화가 없다..(왜 없는지는 아래에서 확인해보자.)
  • 시계바늘처럼 페이지프레임을 가르키는 포인터가 빙빙 돌면서 교체할 페이지를 결정한다.

시계초침은 빙글빙글 돌면서 현재 가르키는 페이지프레임을 확인한다.
해당 페이지프레임의 reference bit가 0이면 해당 페이지프레임을 내려서 교체한다.
reference bit가 1이면 0으로 바꾼뒤, 계속 돈다.

즉, 시계초침이 계속 돌면서 reference bit를 초기화하기에 일반적인 reference bit와 다르게 주기적인 초기화가 없는 것!

  • reference bit를 이용하기에 Locality를 이용하는 교체 알고리즘이란걸 알수 있다.

Second Change Algorithm

update bit도 사용하는 교체 알고리즘이다.
clock algorithm과 유사하다.

  • update bit도 사용하여 교체할 페이지를 결정하기에 성능은 좋다. 그러나 update bit를 추가로 사용하니 clock algorithm보단 더 무거울 것이다.

여러개의 reference bit를 사용하는 알고리즘도 존재하고, LFU, LRU의 반대인 Most의 MFU, MRU 알고리즘들도 존재한다. 시스템 성능을 향상하기위해서 즉, 한정된 메모리를 효율적으로 이용하기 위해 할당된 fixed allocation 메모리에 적재된 페이지를 내려서 교체하는 여러 기법들을 살펴보았다. 이젠 고정된 메모리가아닌 가변적인 variable allocation메모리에 대해서 어떻게 교체하는지 알아보자!!

(variable allocation)

WS(Working Set) Algorithm

프로세스마다 할당하는 메모리의 크기가 가변인 상황에서 페이지 교체하는 한 기법이다.

프로세스가 최근 특정시점(window)에 자주 참조하는 페이지들의 집합을 Working Set이라한다.

window란 a시점부터 b시점까지의 시간을 window라 한다.

이러한 Working Set을 메모리에 적재함으로써 페이지를 교체한다.

최근동안에 참조한 페이지들을 메모리에 적재해놓고 있으므로 locality(지역성)특징을 잘 활용 하는 것으로 볼 수 있다.

이렇게 주황색의 window 시간동안 프로세스가 참조하고 있는 페이지들(Working Set)을 페이지에 적재한다.
window는 특정 시점 t - Δ부터 t까지 시간을 의미한다.
이 Δ는 고정이다. (메모리 할당은 variable, window Δ는 fixed)

그렇기에 Δ값이 성능을 결정짓는 중요한요소이다.

  • Δ와, Working set사이의 관계
    Δ(window size)가 클수록 당연히 메모리에 적재하고있는 Working Set(집합)은 클것이다.

그러가 자세히 보면 window size가 클수록 working set의 size가 커지는 기울기가 줄어드는 걸 볼수있다. 증가량이 줄어든다.

이는 locality 때문이다.
참조하는 페이지를 또 참조하는 지역성 때문에, Working Set, 즉 프로세스가 참조하는 페이지가 증가하긴 하지만 증가율은 줄어드는 것이다!

이러한 지역성의 특징을 잘 나타내는 Working Set의 크기 변화 그래프가 있다.

반복문이 이렇게 세개 있을때, window는 위에서부터 내려간다하면, 프로세스가 현재 참조하는 페이지의 개수는 루프와 루프 사이에서 갑자기 증가하는 그래프가 있다.

이를 Working Set transition이라 한다.
이 또한 지역성의 특징으로 반복문 같은 코드가 있을 경우 참조하는 페이지를 또 참조하기에 잠깐 루프와 루프 사이의 윈도우일 경우 프로세스가 참조하는 페이지의 수가 많아지는 것이다.

  • Working Set algorithm 예시

    Δ가 3이다.
    [1 - 3, 1]
    즉, -2 ~ 1 시간 동안의 윈도우에서 Working Set은 4, 3, 0, 2이다.
    그러므로 메모리에 0 2 3 4 가 적재된걸 볼수있다. 물론 2번 페이지는 없었기에 Page Fault가 일어나면서 메모리에 페이지가 적재된걸 볼수 있다.
    그리고 그다음 윈도우
    -1 ~ 2 시간 동안의 Working set은 3, 0, 2이다.
    그러므로 필요없는 페이지 4는 메모리에서 내려간거 볼수가 있다.
    • 성능 평가
      variable allocation은 fixed allocation과 다르게 프로세스마다 할당받는 메모리의 크기가 가변적이므로 단순하게 page fault의 수만으로 replacement algorithm의 성능을 평가할수 없다.
      추가로 평균 할당 page frame의 수도 고려해야한다.(메모리에 적재된 페이지의 평균 수를 의미한다.)
  • 즉, Working Set은 계속해서, Window안의 Working Set을 보고 메모리를 변화 시켜야한다. 즉, 오버헤드가 크다!!!

그리고 page fault가 일어났을 때의 cost와 page frame을 메모리에서 유지하고 있는 cost도 고려해서 성능을 평가해야한다.

확실한건 Working Set은 window 동안 프로세스가 참조하는 페이지들이 모두 메모리에 적재되어 있어야 하므로 오버헤드가 크다.

Working set은 관리 오버헤드가 크다..

마지막으로 window size와 메모리에 페이지들을 관리하는 비용인 life time, page fault rate에 대한 그래프를 보고 마무리하자.

  • 윈도우 사이즈가 크면 당연하게 메모리에 적재된 페이지의 개수가 많으므로 페이지 frame 유지 비용이 클것이다.
  • 윈도우 사이즈가 크면 페이지들이 많이 메모리에 상주해 있기에 page fault rate가 적어지는 것을 볼수 있다.
    우리는 한가지더!
    locality 덕에 두 그래프 모두의 기울기는 감소되는 것을 볼수 있다.
    여기까지!@!@!@!@ variable allocation에서의 replacement strategy 중 하나인 Working Set algorithm을 알아보았다.!!

Page Fault Frequency(PFF) Algorithm

WS algorithm(Working Set)은 관리하는 오버헤드가 너무크다. 계속해서 윈도우가 바뀔 때마다 메모리에 적재할 페이지들을 변경해야하고.. 심지어 page fault가 일어나지 않더라도 메모리에 적재된 페이지중 현재 window시간동안 참조되지 않는다면 교체되는 것도 확인할수 있다.

이러한 단점을 극복하고자 나온 알고리즘이 PFF알고리즘이다!!

PFF 알고리즘은 Page fault가 일어날 때만 메모리에 적재된 페이지들에 변화를 주자는 것이 목표이다. 당연하게도 Working set알고리즘 보단 관리하는 오버헤드는 적을 것이다.

구체적인 방법은?

먼저 컨셉 두가지를 알아보자.

  1. page fault rate가 낮으면? 메모리에 할당된 page frame수를 줄이자.
  2. page fault rate가 높으면? 메모리에 할당된 page frame수를 늘리자.

두가지 컨셉을 통해서 page fault가 발생할 때, 메모리에 적재된 page frame수를 관리한다.

PFF알고리즘은 현재 페이지 fault가 일어난 시점과, 그 시점에서 가장 최근에 page fault가 일어난 시점 그 사이의 시간!!!과, 우리가 설정한 어떠한 기준 시간(𝛕)을 비교한다.

이 두가지를 통해서 컨셉을 구현한다.
시간간격을 IFT라고 하겠다
IFT가 > 𝛕 라면? page fault가 자주 발생하지 않는다는 의미이다!
IFT가 <= 𝛕 라면? page fault가 자주 발생한다는 의미이다.

전자이면 메모리에 적재된 page frame수를 줄이고, 후자라면 늘림으로써 replacement를 한다.

예시이다.

확실한건 PFF는 page fault 발생 시에만 메모리 상태를 변화시키기에 관리 오버헤드가 WS보다 적다는 것이다!!!

VMIN Algorith(Variable MIN)

fixed allocation에서도 MIN알고리즘이 있었다.
미래에 참조될 페이지들을 미리 알아야 하기에 not practical 하지만 알고리즘들의 성능 평가 기준이 된다 했었다.
variable allocation에서의 VMIN알고리즘도 동일하다.

구체적으로 어떻게 구현된 알고리즘이냐면

  • 현재 시점에서 어떤 페이지 R이 참조가 되면, 해당 페이지 R이 이후 시간동안 또 참조되는 지 확인한다. 또 참조된다면 페이지 R을 유지하고 참조되지 않는다면 페이지 R을 메모리에서 내린다.보면 메모리에 적재된 페이지 프레임수가 엄청 적은걸 볼수 있다.(2, 2, 2, 2, 1, 2 ...)
    미래를 알기 때문에..
    기준은 위와 같다.
  • 페이지 fault가 발생할 경우 처리 비용 = 예측하는 시간 * 메모리에 페이지를 유지하는 비용
    일 경우의 예측하는 시간을 기준으로 하여 VMIN알고리즘을 성능 측정의 평가 도구로 사용하면된다!
  • 그렇다면 예측하는 미래의 그 시간은 어떤기준으로 설정하는가?
    만약 미래를 엄청 오랫동안 본다면 메모리에서 페이지를 거의 안내릴 것이고 미래를 엄청 짧은 시간동안만 본다면 메모리에서 페이지를 자주 내릴 것이다.

  • 예시이다.

지금까지 replacement strategies를 깊게 살펴보았다.
모두 시스템 성능 향상을 위해선 어떤 방법을 적용해야할까? 라는 의문을 해결하기 위해 알아 본 것들이다.

그 밖에도 가상메모리에 대한 이해를 가지고 있으면 여러가지 고려사항을 토대로 시스템 성능을 향상시키는데 도움이 될수 있다.

Page Size

페이지의 크기를 어떻게 할까?
무작정 크게하는게 좋을까 작게하는게 좋을까?
---> 적당한 크기가 좋다.

작은 크기의 페이지와, 큰 크기의 페이지에는 각각 장/단점이 있다.

작은 크기의 페이지 큰 크기의 페이지
내부단편화 크기가 감소한다. 내부 단편화 크기가 증가한다.
페이지들을 관리하는 page table이 크다. 그만큼 관리하는 오버헤드가 크다.(작은 크기의 페이지는 그만큼 페이지의 개수가 많으므로 page table의 엔트리 개수도 많다.) 페이지들을 관리하는 page table이 작다. 그만큼 해당 테이블을 관리하는 오버헤드가 작다.
I/O시간이 증가한다.(페이지의 개수가 많기에 디스크에서 메모리로 이동해야하는 페이지가 많으므로 그만큼 디스크 I/O시간이 증가.) I/O시간이 감소한다.(페이지크기가 큰 만큼 페이지의 개수가 적기에 디스크 I/O시간이 감소한다.)
Locality가 증가.(페이지 크기가 작으므로 Locality이 있는 영역만 페이지에 존재할 수도있다. - 시스템마다 다름) Locality가 감소(페이지 크기가 크므로 Locality가 있는 영역 외에도 다른 영역의 코드가 페이지에 존재할수 있다. - 이것두 시스템 마다 다르다. 확신할수 없다.)
page의 개수가 많기에 그만큼 page fault가 더 자주 일어날 수 있다. page의 개수가 적기에 그만큼 page fault가 덜 일어난다.

요즘 추세는 page의 크기를 점점 키우는 추세이다.

디스크의 속도에 비해 cpu의 속도 성장이 훨씬 빨라왔고, 그 만큼 cpu와 디스크간의 속도차이가 커져왔다. 그렇기에 최대한 디스크에서 메모리로 I/O하는 시간을 줄여 병목현상을 줄이는 것이 좋을 것이다. 이러한 관점에서 봤을땐, 페이지의 크기를 크게하는 것이 I/O 시간이 감소하기에 페이지 크기를 키우는 것이 좋을 것이다. 또 메모리의 크기가 요즘엔 매우 크기 때문에, 페이지의 크기를 작게하면 페이지가 너무 많아져서 관리하는 오버헤드라던가, page fault가 자주 일어날 것이므로 page의 size를 요즘엔 점점 크게하는 추세이다.

그치만 무조건 페이지의 크기를 키우는 것이 능사가 아니다! 위 표와 같이 장/단점이 있는 것이다.

Program Restructuring

가상 메모리의 시스템의 특성에 맞게 프로그램을 재구성 하는 것을 의미한다.
이젠 가상메모리에 대해 이해를 하고 있기에 시스템 전체의 성능을 높이기 위해 가상메모리 시스템의 특성에 맞게 프로그램을 재구성 할 수 있다.

  • 페이지 하나의 크기가 1KB인 페이징 시스템에서 어떻게하면 아래 코드를 재구성하여 성능을 높일수 있을까?
int main(void){
    int zar[256][256];
    int i, j;

    for(int j = 0; j < 256; j++)
        for(int i = 0; i < 256; i++)
            zar[i][j] = 0;

2차원 배열 zar가 스왑디바이스에 어떻게 존재하는지 알아보자.


이렇게 존재하는 상황에서 만약 이 프로세스에 할당된 메모리가 1페이지 프레임이라면 !
계속해서 page0 -> page1 -> page2 -> page 255를 프로세스가 참조하기에 계속 page fault가 날것이다. 즉 256 * 256번의 Page fault가 날것이다.

우리는 페이징 시스템에 대해서 이해하고 있고 성능을 높이기 위해서 재구성할수 있다.
재구성해보면

int main(void){
    int zar[256][256];
    int i, j;

    for(int i = 0; i < 256; i++)
        for(int j = 0; j < 256; j++)
            zar[i][j] = 0;

이렇게 i와 j의 위치를 바꿔서 (0, 0) -> (0, 1) -> ... -> (0, 255) -> (1, 0) -> ..
이런식으로 프로세스가 참조하게 변경하면 이 프로세스에 할당된 page frame이 1개일 경우 page fault가 256번밖에 나타나지 않게되어 성능을 높일수 있다.

즉 페이지폴트 횟수가 256*256 에서 256으로 256배가 줄었다!

가상메모리 시스템에 대해서 이해를 하고 있으면 가상메모리 특성에 맞게 코드를 변경하여 시스템 성능을 높일수 있다.

TLB Reach

TLB란 address mapping할 때 direct mapping의 단점을 해소하기 위해 사용한 하드웨어이다.
TLB reach란 TLB가 가지고 있는 페이지 크기를 의미한다.
즉, TLB Reach란 (TLB entires 수) * (페이지의 크기)
로 나타낼수 있고 더 쉽게 말하면 TLB Reach란 TLB를 통해서 접근할수 있는 메모리의 양을 의미한다.

TLB hit(in hybrid mapping)을 높이려면
TLB의 엔트리 개수를 높이면 된다. 그치만 TLB는 비싸기에 한계가 있다.
그러면 페이지의 크기를 키우면 된다. 그치만 앞에서 본거처럼 페이지의 크기를 키우는데는 그만큼의 장/단점이 있기에 선택하기 어렵다.
그래서 요즘 OS는 다양한 페이지의 크기를 지원한다.

우리의 시스템, 어플리케이션의 특성에 맞게 페이지의 크기를 선택하자!

 

결론

가상 메모리에 대해서 공부한뒤 시스템 전체 성능을 높이기 위한 여러가지 기법들을 배웠다. 가상 메모리의 성능을 높이는데 기준이 되는 중요한 것은 page fault이고, 시스템 성능을 높이기 위해 고려할수 있는 하드웨어, 소프트웨어 기법들을 알아보았다. 특히 페이지를 교체하는 기법에 대해서 자세히 알아보았고, 그것에서 끝나지 않고 가상 메모리 시스템에서 더 고려해야할 것들을 알아보았다. 

https://www.youtube.com/watch?v=_QpNwu_MYck&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=37

728x90

'computer science' 카테고리의 다른 글

[OS] 운영체제 I/O System & Disk Management  (0) 2021.10.12
[OS] 운영체제 File system  (0) 2021.10.04
[OS] 운영체제 Virtual Memory  (0) 2021.09.02
[OS] 운영체제 Memory management  (0) 2021.08.29
[OS] 운영체제 Deadlock  (0) 2021.08.20