CHAPTER 9 - 가상 메모리(Vritual Memory)

CH 9에서는,
- 첫째로, 가상 메모리 시스템의 이점에 대해 알 수 있다.
- 둘째로, Demand Paging과 페이지 교체 정책 등에 대해서 알 수 있다.
- 셋째로, shared memory와 memory-mapping file의 관계에 대해서 알 수 있다.

- 가상 메모리라는 것은 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법이다.
- 이 기법의 주요 장점 중 하나는 사용자 프로그램이 물리 메모리보다 커져도 된다는 점이다.


9.1 배경

- 8장에서 살펴본 메모리 관리 알고리즘들은 현재 실행되고 있는 코드는 반드시 물리 메모리에 존재해야 한다.
- 이 요구 조건을 만족시키는 방법은 전체 프로세스를 메모리에 올리는 것이다.

- 프로그램 전체가 한꺼번에 메모리에 올라와 있어야 하는 것은 아니라는 것을 아래 예를 보며 알 수 있다.
   (1) 프로그램에는 잘 발생하지 않는 오류 상황을 처리하는 코드가 존재한다. 이 코드는 거의 실행되지 않는다.
   (2) 배열, 리스트, 테이블 등은 필요 이상으로 많은 공간을 점유할 수 있다.
   (3) 프로그램 내의 어떤 옵션이나 기능들은 거의 사용되지 않는다.

- 만약 프로그램을 일부분만 메모리에 올려놓고 실행할 수 있다면, 다음과 같은 장점들이 있다.
   (1) 프로그램이 물리 메모리 크기에 의해 제약받지 않게 된다.
   (2) 각 사용자 프로그램이 더 작은 메모리를 차지하므로, 더 많은 프로그램을 수행할 수 있게 된다.
   (3) 프로그램을 메모리에 올리고, 스왑하는데 필요한 입출력 횟수가 줄어들어서 프로그램이 보다 빨리 실행된다.

- 논리 메모리를 물리 메모리부터 분리시켜주는 것 외에 가상 메모리는 페이지 공유를 통해 파일이나 메모리가
   둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 한다. 이는 아래와 같은 장점들이 있다.
   (1) 시스템 라이브러리가 여러 프로세스들에 의해 공유될 수 있다.
   (2) 프로세스들이 메모리를 공유할 수 있다.

 


9.2 요구 페이징(Demand Paging)

- 프로그램을 디스크에서 메모리로 load 하는 가장 간단한 방법은 프로그램 시작 시에 프로그램의 전부를 물리 메모리에 load 하는 것이다.
- 다른 방법으로는 초기에 필요한 것들만 메모리에 load 하는 요구 페이징(Demand Paging) 전략이 있을 수 있다.
- Demand Paging을 사용하는 가상 메모리에서는 페이지들이 실행 과정에서 필요로 할 때 load 된다.

- Demand Paging 기법은 프로세스를 실행하고 싶으면 메모리로 읽어들인다 (Swap in)
- 이때, 전체 프로세스를 읽어오지 않고, 필요하지 않은 페이지는 메모리에 load 하지 않는다.
- 이 역할을 게으른 스와퍼(Lazy Swapper) 또는 페이저(Pager)가 수행한다.
- 페이저(Pager)는 프로세스 내의 개별 페이지들을 관리한다.

* 기본 개념(Basic Concept)

- Swap-in 시에 Pager는 프로세스가 swap-out 되기 전에 실제로 사용될 페이지들이 어떤 것인지를 추측한다.
- Pager는 프로세스 전체를 swap-in 하는 대신에 실제 필요한 페이지들만 메모리로 읽어온다.
- 사용되지 않을 페이지를 메모리에 가져오지 않음으로써 시간과 메모리 낭비를 줄일 수 있다.

디스크 내 인접한 공간과 페이지화된 메모리 간의 이동


- 이를 위해 8.4.3절에서 언급한 valid/invalid bit를 사용할 수 있다.
- Demand Paging에서 이 비트가 valid 하면, 해당 페이지가 메모리에 있다는 의미이다.
- Demand Paging에서 이 비트가 invalid 하면, 해당 페이지가 유효하지 않거나, 디스크에 존재한다는 의미이다.

 

일부 페이지가 주 메모리에 없을 때의 페이지 테이블

- 만약 프로세스가 메모리에 올라와 있지 않은 페이지를 접근하려고 하면, 페이지 부재 트립(Page-fault trap)이 발생한다.

- 페이지가 적재되고 나면 프로세스는 수행을 계속하는데, 프로세스가 사용하는 모든 페이지가 메모리에 올라올 때까지 필요할 때마다 페이지 부재(Page Fault)가 발생한다. 이후, 일단 필요한 모든 페이지가 load 되고 나면, 더 이상 fault는 발생하지 않는다.

- 이는 어떤 페이지가 필요해지기 전에는 해당 페이지를 메모리로 적재하지 않는 "pure demand paging"이다.

- 프로그램들은 한 명령어에서도 여러 page fault를 일으킬 가능성이 있지만, 실제 프로그램들은 어느 한 특정

작은 부분만 집중적으로 참조하는 경향이 있기 때문에, demand paging은 만족할만한 성능을 보인다.

 

* 요구 페이징의 성능(Performance of Demand Paging)

- page fault의 확률이 p라고 하면, 실질 접근 시간(Effective access time)은

effective access time = ((1-p) * ma) + (p * page fault time)

- Page fault를 처리하는 시간은 아래 3가지의 큰 요소로 이루어져 있다.
1. 인터럽트의 처리 (Service the page-fault interrupt.)
2. 페이지 읽기 (Read in Page)
3. 프로세스 재시작 (Restart the process.)

 - 실질 접근 시간(Effective access time) 페이지 부재율(Page fault rate)에 비례한다.
- 이에 페이지 부재율(Page fault rate)를 낮추는 것이 성능을 높이는 데 중요하다.

- Demand Paging의 또 다른 특성 중 하나는 스왑 공간의 관리이다.
- 스왑 공간에서의 디스크 입출력은 일반적인 파일 시스템에서의 입출력보다 빠르다.
- 그 이유는 스왑 공간은 파일 시스템보다 더 큰 블록을 사용하기 때문이고,
   또 스왑공간과 입출력을 할 때는
lookup이나 간접 할당 방법 등은 사용하지 않기 때문이다.

 


9.3 쓰기 시 복사(Copy-on-write)

- fork() 이후 exec()를 호출할 자식 프로세스에서는 부모로부터 복사해온 페이지들은 다 쓸모가 없어진다.
- 이에, 부모의 페이지들을 다 복사해오는 대신 쓰기 시 복사(copy-on-write) 방식을 사용할 수 있다.
- 이 방식에서는 자식 프로세스가 시작할 때 부모의 페이지를 당분간 함께 사용하도록 한다.
- 이때, 공유되는 페이지를 쓰기 시 복사(copy-on-write) 페이지라고 표시하며,
"두 프로세스 중 한 프로세스가 공유 중인 페이지에 쓸 때 그 페이지의 복사본이 만들어진다."라는 의미이다.
- 수정되지 않는 페이지들은 자식과 부모 간에 계속 공유 될 수 있는 것이다.

프로세스 1이 페이지 C를 수정하기 전


프로세스 1이 페이지 C를 수정하기 후


- copy-on-write 처리 과정에서 페이지 복사본을 만들 때, 보통 OS는 zero-fill-on-demand 기법을 사용한다.
- zero-fill-on-demand 기법에서는 페이지를 할당할 때 그 내용을 다 0으로 채워 이전 내용을 지우게 된다.

 


9.4 페이지 교체(Page Replacement)

 

* 기본적인 페이지 교체

- 페이지 교체(Page Replacement)는 아래와 같이 행해진다.
(1) 만약 빈 frame이 없다면, 현재 사용되고 있지 않은 프레임을 찾아서 비운다.
(2) 해당 프레임의 내용을 swap space에 쓰고, 페이지 테이블을 변화시킨다. (프레임이 비어있음을 나타냄)
(3) 비워진 프레임을 page fault를 발생시킨 프로세스에게 할당하여 사용한다.

- 빈 frame이 없는 경우에 디스크를 두 번 접근해야 하므로 page fault service time이 2배 소요된다.
- 이러한 overhead는 modify bit 또는 dirty bit를 사용해서 감소시킬 수 있다.

- Demand Paging 시스템은 아래 두 가지 중요한 문제를 해결해야 한다.
(1) 프레임 할당 알고리즘(Frame Allocation Algorithm)
(2) 페이지 교체 알고리즘(Page-replacement Algorithm)
- 즉, 각 프로세스에게 얼마나 많은 frame을 할당해야 하는지와 어떤 page를 교체해야 하는지를 결정해야 한다.
- 일반적으로, page-fault rate가 가장 낮은 페이지를 선정하여 교체한다.

- 이후 설명할 페이지 교체 알고리즘의 설명을 위해 3개의 프레임을 가진 메모리를 가정하고, page reference string은 아래와 같다.

7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

* FIFO 페이지 교체(FIFO Page Replacement)

- 가장 간단한 페이지 교체 알고리즘은 FIFO(First in, First out) 알고리즘이다.
- 메모리에 가장 오래 올라와 있던 page를 바꾸는 방법이다.
- 예시 page reference string에 대해 15개의 page fault를 일으킨다.

FIFO Page Replacement Algorithm ​

- FIFO 알고리즘은 성능이 항상 좋지 않은데, 아래와 같은 경우에 그렇다.

1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5

- 이 경우, 4개의 frame을 사용하면 page fault가 10번, 3개의 frame을 사용하면 page fault가 9번 일어난다.
- 이러한 결과는 모순적이며, 이를 Belady의 모순(Belady's anomaly)라고 부른다.
- Belady의 모순은 프로세스에게 frame을 더 주었음에도, page fault가 더 증가하는 것을 의미한다.

 

* 최적 페이지 교체(Optimal Page Replacement)

- 최적 교체 정책(Optimal page replacement algorithm)은 항상 최적의 결과를 가져온다.
- 이 정책은 "앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체"하는 방법이다.
- 이 알고리즘은 할당된 frame 수가 고정된 경우, 가장 낮은 page fault rate를 보장한다.
- 예시 page reference string에 대해 9개의 page fault를 일으킨다.

Optimal Page Replacement algorithm


- 하지만, 실제로 최적 페이지 교체 알고리즘은 구현하기 힘들다.
- 이 방식은 프로세스가 메모리를 앞으로 어떻게 참조할 것인지를 미리 알아야 하기 때문이다.

 

* LRU 페이지 교체(LRU Page Replacement)

- LRU(Least Recently Used) 페이지 교체 알고리즘은 최근의 과거를 가까운 미래의 근사치로 보는 알고리즘이다.
- LRU는 각 페이지마다 마지막 사용 시간을 유지하고, 페이지 교체 시에 가장 오랫동안 사용되지 않은 페이지를 교체한다.
- 예시 page reference string에 대해 12개의 page fault를 일으킨다.

LRU Page Replacment Algorithm

- LRU 알고리즘은 페이지 교체 알고리즘으로 자주 사용되며, 좋은 알고리즘으로 인정받고 있다.
- 하지만, 이 알고리즘을 구현하기 위해서는 하드웨어의 지원이 필요하며, 아래 두 가지 방법이 가능하다.
   (1) 계수기(Counters) : 각 페이지 항목마다 time-of-use field를 넣는다.
   (2) 스택(stack) : 페이지 번호에 대한 스택을 유지하여, top이 가장 최근, bottom이 가장 오래된 페이지가 된다.

 

* LRU 근사 페이지 교체(LRU Approximation Page Replacement)

- LRU page replacement를 충분히 지원할 수 있는 하드웨어는 거의 없다.
- 그러나, 많은 시스템들이 참조 비트(Reference bit)의 형태로 어느 정도의 지원을 하려고 한다.
- 처음에 모든 참조 비트는 0으로 초기화 고, 프로세스가 실행되면서 참조되는 페이지의 비트는 1로 바뀐다.

(1) 부가적 참조 비트 알고리즘(Additional-Reference Bits Algorithm)
- 일정한 간격마다 참조 비트를 기록함으로써 추가적인 선후 관계 정보를 얻을 수 있다.
- 각 페이지에 대해 8비트의 참조 비트를 사용하며, 가장 최근 8구간 동안의 해당 페이지의 사용 기록을 담는다.

(2) 2차 기회 알고리즘(Second-Chance Algorithm)
- 2차 기회 알고리즘의 기본은 FIFO 교체 알고리즘이다. 이와 함께 페이지가 선택될 때마다 참조 비트를 확인한다.
- 참조 비트가 0이면 페이지를 교체하고, 1이면 다시 한번 기회를 준 뒤 FIFO로 넘어간다.

(3) 개선된 2차 기회 알고리즘(Enhanced Second-Chance Algorithm)
(0, 0) : 최근에 사용되지도 변경되지도 않은 경우 (교체하기 가장 좋은 페이지)
(0, 1) : 최근에 사용되지는 않았지만, 변경은 된 경우 ( 교체에 적당하지 않은 페이지)
(1, 0) : 최근에 사용은 되었으나, 변경은 되지 않은 경우 ( 다시 사용될 가능성이 높은 페이지)
(1, 1) : 최근에 사용도 되었고, 변경도 된 경우 (다시 사용될 가능성이 높으며 교체에 적당하지 않은 페이지)

* 계수 기반 페이지 교체(Counting-Based Page Replacement)

- 아래 두 가지 기법이 있다.
(1) LFU (Least Frequently Used) : 참조 횟수가 가장 작은 페이지를 교체하는 알고리즘
(2) MFU (Most Frequently Used) : 참조 횟수가 가장 큰 페이지를 교체하는 알고리즘

- 이 두 가지 알고리즘은 구현하는 데 비용이 많이 들고, OPT 알고리즘을 근사하지 못하기 때문에 잘 쓰이지 않는다.

* 페이지 버퍼링 알고리즘(Page-Buffering Algorithm)

- 페이지 교체 알고리즘과 병행하여 여러 가지 버퍼링 기법이 사용될 수 있다.

(1) 시스템이 available frame을 여러 개 가지고 있다가, page fault가 발생하면 교체될 페이지를 기다리지 않고
  새로운 페이지에 먼저 읽어 들이게 하는 방법

(2) available frame pool을 유지하지만, 그 pool 속 각 frame의 원래 임자 페이지가 누구였었는지를 기억하는 방법

 


9.5 프레임의 할당(Allocation of Frames)

- 여러 개의 프로세스들에 대해 제한된 메모리를 어떻게 할당할 것인가에 대한 문제이다.

* 최소로 할당해야 할 프레임의 수 (Minimum Number of Frames)

- 페이지 공유가 없다면, avilable frame 수보다 더 많이 할당할 수는 없지만, 너무 작게 할당해서는 안 된다.
- 각 프로세스에 할당되는 frame 수가 줄어들면 page fault rate는 증가하고, 프로세스 실행은 늦어지게 된다.

* 할당 알고리즘(Allocation of Algorithms)

- 가장 쉬운 할당 방법은 모든 프로세스에게 똑같이 할당해 주는 방법이다.
- 예를 들어 93개의 frame과 5개의 프로세스가 있을 경우, 각 프로세스는 18개의 frame을 할당받는다.
- 나머지 3개의 frame은 free frame buffer pool로 활용한다.
- 이런 방법을 균등 할당(Equal Allocation)이라고 한다.

- 그러나, 10KB와 132KB의 프로세스가 있을 경우, 균등 할당은 좋은 방법이 아니다.
- 이에, 각 프로세스의 크기 비율에 맞춰 frame을 할당하는 비례 할당 방식(Proportional allocation)을 사용할 수 있다.
- 균등 할당과 비례 할당은 모두 프로세스의 우선순위를 고려하지 않는 방법이다.

* 전역 대 지역할당(Global Veersus Local Allocation)

- 다수의 프로세스가 frame 할당을 위해 경쟁하는 환경에서 페이지 교체 알고리즘은 크게 두 가지 범주로 나뉜다.
  (1) 전역 교체(Global Replacement) (2) 지역 교체 (Local Replacement)

- 전역 교체는 프로세스가 교체할 frame을 다른 프로세스에 속한 frame을 포함한 모든 프레임을 대상으로 찾는 경우이다.
- 지역 교체는 각 프로세스가 자기에게 할당된 frame들 중에서만 교체될 victim을 선택할 수 있는 경우이다.

- 지역 교체 방법에서는 프로세스에 할당된 프레임의 수는 변하지 않는다.
- 전역 교체 아래에서는 한 프로세스에 할당된 프레임의 수는 바뀔 수 있다.

- 전역 교체 알고리즘에서의 한 가지 문제점은 한 프로세스가 그 자신의 page fault rate를 조절할 수 없다는 것.
- 한 프로세스의 page fault rate는 그 프로세스가 어떤 프로세스들과 함께 실행되느냐에 영향을 받는다.
- 지역 교체 알고리즘의 경우는 다른 프로세스에게 영향을 받지 않는데, 유일하게 그 프로세스의 페이징 형태에만 영향을 받기 때문

- 일반적으로 전역 교체가 지역 교체 알고리즘보다 더 좋은 성능을 보이며, 더 자주 쓰인다.

* 비균등 메모리 접근(Non-Uniform Memory Access)

- 메모리 접근 시간이 현저하게 차이가 나는 시스템을 모두 비균등 메모리 접근(NUMA)라고 한다.
- 이러한 시스템에서 메모리를 동등하게 대하면, NUMA 구조를 고려한 메모리 할당 알고리즘을
  사용하는 시스템에서보다 CPU가 메모리를 접근할 때 대기 시간이 매우 길어지게 된다.

 


9.6 스레싱(Thrashing)

- 충분한 frame을 할당받지 못한 프로세스는 page fault가 바로 발생하게 된다.
- 이미 활발하게 사용되는 페이지들로만 이루어져 있으므로, 어떤 페이지가 교체되든 바로 다시 필요해진다.
- 이런 과도한 페이징 작업을 스레싱(Thrashing)이라고 한다.

* 스레싱의 원인(Cause of Thrashing)

- 스레싱(Thrashing)은 심각한 성능 저하를 유발한다.
- 운영체제는 CPU 이용률(Utilization)을 검사하게 되는 데, 만약 CPU 이용률이 너무 낮아지면 새로운 프로세스를
  시스템에 더 추가해서 다중 프로그래밍의 정도(Degree)를 높인다.

- 만약 많은 프로세스들이 실행을 위해 추가의 프레임을 원한다면, 계속해서 page fault가 발생할 것이다.
- 이에 따라, 프로세스들이 paging device를 기다리는 동안 CPU 이용률은 계속해서 떨어진다.
- CPU 스케줄러는 CPU 이용률이 떨어지는 것을 보고, 계속 새로운 프로세스를 추가하려고 할 것이다.
- 계속해서 더 많은 page fault와 더 긴 pageing device waiting time이 생기게 된다.
- 이에 스레싱(Thrashing)이 발생하게 되고, 시스템의 처리율이 상당히 낮아지게 된다.

- 다중 프로그래밍의 정도가 높아짐에 따라, 계속해서 CPU 이용률이 최댓값까지 증가하기는 한다.
- 하지만, 그 뒤 급격하게 감소하며 스레싱(Thrashing)이 이 일어나게 된다.
- 따라서 최고점에서 다중 프로그래밍의 정도를 낮춰야 한다.

- 스레싱(Thrashing)은 지역 교환 알고리즘이나 우선순위 교환 알고리즘을 사용하면 제한할 수 있다.
- 지역 교환 알고리즘을 사용하면, 한 프로세스가 스레싱을 유발하더라도 다른 프로세스로부터 frame을
  뺏어올 수 없으므로, 다른 프로세스는 스레싱(Thrashing)으로부터 자유로울 수 있다.

- 스레싱(Thrashing) 현상을 방지하기 위해서는 각 프로세스가 필요로 하는 최소한의 프레임 개수를 보장해야 한다.
- 프로세스가 실제로 사용하고 있는 프레임의 수가 몇 개인가를 알아보는 것은 프로세스 실행의 지역성 모델(Locality model)을 기반으로 한다.
- 지역성 모델이란 프로세스가 실행될 때에는 항상 어떤 특정한 지역에서만 메모리를 집중적으로 참조함을 말한다.

 

* 작업 집합 모델(Working-Set Model)

- 작업 집합 모델(Working-Set Model)은 지역성을 기반으로 하고 있다.
- 기본 아이디어는 최근 △만큼의 page reference를 관찰하겠다는 것이다.
- 한 프로세스가 최근 △번 페이지를 참조했다면, 그 안에 들어있는 서로 다른 페이지들의 집합을 작업 집합이라고 부른다.

* 페이지 부재 빈도(PFF, Page-Fault Frequency)

- 작업 집합 모델은 성능이 좋으며, 작업 집합에 대해 안다는 것은 선페이징(prepaging) 시에 유용하다.
- 하지만 스레싱을 조절하는 데는 알맞지 않을 수 있는데, 페이지 부재 빈도(PFF)는 보다 더 직접적으로
스레싱(Thrashing)을 조절한다.

- 스레싱(Thrashing)이란 페이지 부재율(Page Fault rate)이 높은 것을 의미한다.
- 페이지 부재율이 너무 높으면 그 프로세스가 더 많은 Frame을 필요로 한다는 의미이다.
- 페이지 부재율이 너무 낮으면 그 프로세스가 너무 많은 Frame을 갖고 있다는 것을 의미한다.
- 따라서 페이지 부재율의 상한과 하한을 정해놓고, 만약 페이지 부재율이 상한을 넘으면 그 프로세스에게 Frame을 더 할당해 주고, 하한보다 낮아지면 그 프로세스의 프레임 수를 줄인다.
- 위의 방법으로 직접적으로 부재율을 관찰하고 조절함으로써 스레싱(Thrashing)을 방지할 수 있다.

 


9.7 메모리 사상 파일(Memory-Mapped File)

- open(), write() system call을 사용하여 디스크에 있는 파일을 순차적으로 읽는다고 가정해보자.

- 이러한 방식을 사용하면 파일이 매번 access 될 때마다, system call을 해야 한다.

- 이와 같이 하는 대신에 디스크 입출력을 메모리 참조 방식으로 대신할 수 있다.

- 이러한 방식을 메모리 사상(memory-mapping)이라고 한다.

 


9.8 커널 메모리의 할당

- 커널 메모리는 보통 사용자 모드 프로세스에게 할당해 주기 위한 페이지 리스트와는 별도의 메모리 풀에서 할당받는다.
  그 이유는 아래 2가지와 같다.

(1) 커널은 다양한 크기의 자료 구조를 위해 메모리를 할당받는다. 이 자료구조들은 페이지 크기보다 작은 크기를 갖기도 한다. 때문에
       커널은 메모리를 조심스럽게 사용하여야 하고, 단편화에 의한 낭비를 줄여야 한다.

(2) 사용자 모드 프로세스에 할당되는 페이지는 물리 메모리 상에서 꼭 연속적일 필요가 없다.
        하지만, 특정 하드웨어 장치는 물리적으로 연속적인 메모리를 요구할 수 있다.

* 버디 시스템

- 버디 시스템은 물리적으로 연속된 페이지들로 이루어진 고정된 크기의 세그먼트로부터 메모리를 할당한다.

- 메모리는 이 세그먼트로부터 2의 거듭제곱 단위로 할당된다.

- 예를 들어 11KB가 요청되면, 16-KB 세그먼트가 할당된다.

- 버디 시스템의 장점 중 하나는 합병(Coalescing)라고 부르는 과정을 통해 서로 인접한 버디들이 손쉽게 하나의 큰 세그먼트로 합쳐질 수 있다는 점이다.

- 버디 시스템의 분명한 단점은 2의 거듭제곱 단위로 메모리를 할당받기 때문에, 단편화를 불러올 수 있다.

 

Buddy System Allocation

 

* 슬랩 할당(Slab Allocation)

- 두 번째 커널 메모리 할당 정책은 슬랩 할당(Slab Allocation)이다.

- 슬랩(Slab)은 하나 이상의 연속된 페이지들로 구성되어 있으며, 캐시(Cache)는 하나 이상의 슬랩들로 구성된다.

Slab Allocation

 


9.9 기타 고려 사항


* 프리 페이징(PrePaging)

- 프리 페이징(prepaging)는 과도한 페이지 부재를 방지하기 위한 기법이다.
- 프리 페이징(prepaging)은 관련된 모든 페이지를 사전에 한꺼번에 메모리 내로 가져오는 기법이다.
- 프리 페이징(prepaging)을 하는 이유는 미리 올라온 페이지들이 실제로 곧 사용될 것이라고 예상하기 때문이다.

* 페이지 크기(Page Size)

- 페이지 테이블의 크기를 작게 유지하기 위해서는 큰 크기의 페이지가 좋다.
- 할당해 준 메모리 사용 효율을 높이기 위해서는 작은 크기의 페이지가 좋다. (내부 단편화를 줄임)

* 역 페이지 테이블(Inverted Page Table)

- 8.6.3절에서 역 페이지 테이블의 목적은 페이지 테이블이 차지하는 메모리 공간을 줄이기 위함이었다.
- 이 테이블은 <process-id, page-number>의해 index 되며, 물리 메모리마다 한 항목을 갖는다.
- 각 페이지 프레임에 어떤 가상 메모리 페이지가 저장되어 있는지의 정보만 유지하면 되기 때문에 필요한 물리 메모리 양을 줄인다.

- 이 밖에도 프로그램 구조, 입출력 상호 잠금과 페이지 잠금 등을 고려해야 한다.


 

-Reference-
Abraham Silberschatz, Peter B. Galvin, Greg Gagne의 『Operating System Concept 9th』