#swap-space #swap-in #swap-out

page fault

page table entry안에 present bit이 있었다. 1이면 매핑이 유효하다(메모리에 존재한다)는 것이고 0이면 유효하지 않다는 것을 나타낸다. 그런데 0인경우 page fault가 발생한다. 예를들어 P라는 페이지에 접근하려고 한다. 그 경우 P+1페이지도 접근할것이라고 생각하여 os는 둘다 맵핑시켜준다. 이를 Prefetching이라고 한다.

🔗 Swapping

실제로 물리메모리는 모든 프로세스에게 제공하기엔 부족하다. 물리메모리에서 당장 쓰지 않는 것들은 다른곳에 빼놓는 방법이 필요하다. 운영체제는 그런 저장장치를 사용하여 프로세스마다 큰 address space를 지원해 준다.

swap space

그런 용도의 저장공간을 swap space라고 하고 디스크에 존재한다. 필요없는 물리메모리는 여기에 저장하고swap-out 반대로 필요해서 다시 메모리르 적재시키는 것을 swap-in라고 한다. 항상 페이지 크기로 옮긴다.

present bit

주소변환할때 필요한 페이지가 어디있는지 알기위해 존재하는 것이 present bit이다. 1인경우 메모리에 존재하는 것이고, 0인경우 메모리에 없고 swap space에 있다는 것을 의미한다.

page fault

present bit이 0인경우 page fault가 발생한다. 이를 page-fault handler로 해결한다. 이 핸들러는 스왑된 페이지를 swap-in하여 다시 메모리로 적재시킨다. swap sapce에서 원하는 페이지를 어떻게 찾는가? 일반적으로 page table entry(PTE)내의 PFN에다가 swap space안에서의 주소를 적어놓는다. swap space의 오프셋을 적는다고 보면 된다.

🔗 Page Replacement

swap-out과 swap-in이 반복적으로 일어나면 속도가 굉장히 느려질 수 있다. os는 미리 swap 다 차기 전에 여유를 만들어 놓는다. 그럴때 이제 어떤 순으로 페이지를 쫓아낼지 고민해야한다. 여러가지 페이지 교체 알고리즘이 있다.

  • FIFO
  • LFU(Least-Frequently-Used)
  • LRU(Least-Recentlyly-Used)

LFU와 LRU는 히스토리를 기반으로 결정하는데 이를 저장하는게 만만한 일이 아니다. 현실적으로 LRU,LFU를 정확히 구현하기는 어렵다 그래서 Approxiating LRU라는 방법이 있다. LRU와 비슷한 Clock algorithm이라고 불린다.

eviction(제거)이 일어나야 하는 경우, 시계바늘을 돌리면서 referece bit에서 1을 빼주고 0이되는 경우 eviction(제거)한다. 넣어준 것은 reference bit을 1로 설정해준다.