CS/Operation System

Ch.9. Virtual Memory

아헿헿헿 2022. 7. 5. 06:47
  1. 가상 메모리 시스템의 이점에 대해 알 수 있습니다.
  2. 요구 페이징과 페이지 교체 정책 등에 대해서 알 수 있습니다.
  3. 공유 메모리와 메모리 사상 파일의 관계에 대해서 알 수 있습니다.
  4. 커널 메모리를 관리하는 기법에 대해 탐구할 수 있습니다.

9.1. Background

가상 메모리는 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법으로 사용자 프로그램이 물리 메모리보다 커져도 된다는 장점을 가지고 있습니다. 8장에서 살펴본 메모리 관리 알고리즘들은 현재 실행되고 있는 코드는 반드시 물리 메모리에 존재해야 합니다. 이 요구 조건을 만족시키는 방법은 전체 프로세스를 메모리에 올리는 것이지만 프로그램 전체가 꼭 그러할 필요는 없습니다. 만약 프로그램을 일부분만 메모리에 올려놓고 실행할 수 있다면, 다음과 같은 장점들이 생깁니다.

  • 프로그램이 물리 메모리 크기에 의해 제약받지 않게 됩니다.
  • 각 사용자 프로그램이 더 작은 메모리를 차지하므로, 더 많은 프로그램을 수행할 수 있게 됩니다.
  • 프로그램을 메모리에 올리고, 스왑하는데 필요한 입출력 횟수가 줄어들어서 프로그램이 보다 빨리 실행됩니다.

논리 메모리를 물리 메모리부터 분리시켜주는 것 외에 가상 메모리는 페이지 공유를 통해 파일이나 메모리가 둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 합니다. 이는 시스템 라이브러리 및 메모리가 여러 프로세스들에 의해 공유될 수 있게 됩니다.


9.2. Demand Paging

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

 요구 페이징 기법은 프로세스를 실행하고 싶으면 메모리로 읽어들입니다. (swap in) 이때, 전체 프로세스를 읽어오지 않고, 필요하지 않은 페이지는 메모리에 적재하지 않습니다. 이 역할을 게으른 스와퍼(Lazy Swapper) 또는 페이저(Pager)가 수행합니다. 페이저는 프로세스 내의 개별 페이지들을 관리합니다.

 

9.2.1 기본 개념(Basic Concept) 

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

디스크 내 인접한 공간과 페이지화된 메모리 간의 이동 이를 위해 8.4.3절에서 언급한 valid/invalid bit를 사용할 수 있습니다. 요구 페이징에서 이 비트가 valid 하면, 해당 페이지가 메모리에 있다는 의미입니다. 요구 페이징에서 이 비트가 invalid 하면, 해당 페이지가 유효하지 않거나, 디스크에 존재한다는 의미입니다.

 일부 페이지가 주 메모리에 없을 때의 페이지 테이블 만약 프로세스가 메모리에 올라와 있지 않은 페이지를 접근하려고 하면, 페이지 부재 트립(Page-fault trap)이 발생합니다. 이는 다음과 같이 처리 됩니다.

  1. 프로세스에 대한 내부 테이블로 메모리 참조의 유효 여부를 알아냅니다.
  2. 무효하다면 프로세스가 중단되고, 유효한데 참조 페이지가 메모리에 올라오지 않았다면 디스크로부터 가져와야 합니다.
  3. 먼저 빈 공간, 즉 자유 프레임을 찾습니다.
  4. 새로 할당된 프레임으로 해당 페이지를 읽어 들이도록 요청하고, 내부 테이블을 수정한 후 명렁을 그대로 다시 수행합니다.

페이지가 적재되고 나면 프로세스는 수행을 계속하는 데, 프로세스가 사용하는 모든 페이지가 메모리에 올라올 때까지 필요할 때마다 페이지 부재가 발생합니다. 이후, 일단 필요한 모든 페이지가 적재되고 나면, 더 이상 페이지 부재는 발생하지 않습니다. 이는 어떤 페이지가 필요해지기 전에는 해당 페이지를 메모리로 적재하지 않는 순수 요구 페이징(pure demand paging)입니다. 프로그램들은 한 명령어에서도 여러 페이지 부재를 일으킬 가능성이 있지만, 실제 프로그램들은 어느 한 특정 작은 부분만 집중적으로 참조하는 경향이 있기 때문에, 요구 페이징은 만족할만한 성능을 보입니다.

 

9.2.2 Performance of Demand Paging

Page fault를 처리하는 시간은 아래 3가지의 큰 요소로 이루어져 있습니다.

  1. 인터럽트의 처리 (Service the page-fault interrupt.)
  2. 페이지 읽기 (Read in Page)
  3. 프로세스 재시작 (Restart the process.)

실질 접근 시간(Effective access time) 페이지 부재율(Page fault rate)에 비례합니다. 이에 페이지 부재율를 낮추는 것이 성능을 높이는 데 중요합니다. 요구 페이징의 또 다른 특성 중 하나는 스왑 공간의 관리입니다. 스왑 공간에서의 디스크 입출력은 일반적인 파일 시스템에서의 입출력보다 빠릅니다. 그 이유는 스왑 공간은 파일 시스템보다 더 큰 블록을 사용하기 때문이고, 또 스왑공간과 입출력을 할 때는 lookup이나 간접 할당 방법 등은 사용하지 않기 때문입니다.


9.3 Copy-on-write

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

 프로세스 1이 페이지 C를 수정하기 전과 수정한 후의 차이점이 위와 같이 나타납니다. copy-on-write 처리 과정에서 페이지 복사본을 만들 때, 보통 OS는 zero-fill-on-demand 기법을 사용합니다. zero-fill-on-demand 기법에서는 페이지를 할당할 때 그 내용을 다 0으로 채워 이전 내용을 지우게 됩니다.


9.4. Page Replacement

9.4.1 기본적인 페이지 교체

페이지 교체는 아래와 같이 행해집니다.

  1. 만약 빈 frame이 없다면, 현재 사용되고 있지 않은 프레임을 찾아서 비웁니다.
  2. 해당 프레임의 내용을 swap space에 쓰고, 페이지 테이블을 변화시킵니다.
  3. 비워진 프레임을 page fault를 발생시킨 프로세스에게 할당하여 사용합니다.

빈 frame이 없는 경우에 디스크를 두 번 접근해야 하므로 페이지 부재 서비스 루틴이 2배 소요되는데, 이러한 오버헤드는 변경 비트를 사용해서 감소시킬 수 있습니다. 요구 페이징 시스템은 아래 두 가지 중요한 문제를 해결해야 합니다.

  • 프레임 할당 알고리즘(Frame Allocation Algorithm)
  • 페이지 교체 알고리즘(Page-replacement Algorithm)

즉, 각 프로세스에게 얼마나 많은 frame을 할당해야 하는지와 어떤 page를 교체해야 하는지를 결정해야 합니다. 일반적으로, 페이지 부재률이 가장 낮은 페이지를 선정하여 교체합니다. 앞으로 설명할 페이지 교체 알고리즘을 설명하기 위해 3개의 프레임을 가진 메모리를 가정하고, 페이지 참조열(page reference string)은 아래와 같습니다.

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

 

9.4.2 FIFO Page Replacement

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

FIFO 알고리즘은 성능이 좋지 않은데 아래의 경우는 더욱 심합니다.

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

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

 

9.4.3 Optimal Page Replacement

최적 교체 정책(Optimal page replacement algorithm)은 항상 최적의 결과를 가져옵니다. 이 정책은 "앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체"하는 방법입니다. 이 알고리즘은 할당된 frame 수가 고정된 경우, 가장 낮은 페이지 부재율을 보장합니다. 예시 페이지 참조열에 대해 9개의 페이지 부재를 일으킵니다.

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

 

9.4.4 LRU Page Replacement

LRU(Least Recently Used) 페이지 교체 알고리즘은 최근의 과거를 가까운 미래의 근사치로 보는 알고리즘입니다. LRU는 각 페이지마다 마지막 사용 시간을 유지하고, 페이지 교체 시에 가장 오랫동안 사용되지 않은 페이지를 교체합니다. 예시 페이지 참조열에 대해 12개의 페이지 부재를 일으킵니다.

LRU 알고리즘은 페이지 교체 알고리즘으로 자주 사용되며, 좋은 알고리즘으로 인정받고 있습니다. 하지만, 이 알고리즘을 구현하기 위해서는 하드웨어의 지원이 필요하며, 아래 두 가지 방법이 가능합니다.

  1. 계수기(Counters): 각 페이지 항목마다 time-of-use field를 넣습니다. 매번 카운터를 바꿔주어야 합니다.
  2. 스택(stack): 페이지 번호에 대한 스택을 유지하여, top이 가장 최근, bottom이 가장 오래된 페이지가 됩니다. 최악의 경우 맨 밑의 스택을 맨 위로 옮겨야 합니다.

이는 FIFO와 달리 Belady의 모순 현상을 야기하지 않습니다.

 

9.4.5 LRU Approximation Page Replacement

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

 

- 부가적 참조 비트 알고리즘(Additional-Reference Bits Algorithm)

일정한 간격마다 참조 비트를 기록함으로써 추가적인 선후 관계 정보를 얻을 수 있습니다. 각 페이지에 대해 8비트의 참조 비트를 사용하며, 가장 최근 8구간 동안의 해당 페이지의 사용 기록을 담습니다.

 

- 2차 기회 알고리즘(Second-Chance Algorithm)

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

 

- 개선된 2차 기회 알고리즘(Enhanced Second-Chance Algorithm)

(0, 1) : 최근에 사용되지는 않았지만, 변경은 된 경우 ( 교체에 적당하지 않은 페이지)

(1, 1) : 최근에 사용도 되었고, 변경도 된 경우 (다시 사용될 가능성이 높으며 교체에 적당하지 않은 페이지)

(1, 0) : 최근에 사용은 되었으나, 변경은 되지 않은 경우 ( 다시 사용될 가능성이 높은 페이지)

(0, 0) : 최근에 사용되지도 변경되지도 않은 경우 (교체하기 가장 좋은 페이지)

 

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

아래 두 가지 기법이 있습니다.

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

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

 

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

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

  1. 시스템이 available frame을 여러 개 가지고 있다가, 페이지 부재가 발생하면 교체될 페이지를 기다리지 않고 새로운 페이지에 먼저 읽어 들이게 하는 방법
  2. available frame pool을 유지하지만, 그 pool 속 각 frame의 원래 임자 페이지가 누구였었는지를 기억하는 방법

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

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

 

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

페이지 공유가 없다면, 가용 frame 수보다 더 많이 할당할 수는 없지만, 너무 작게 할당해서는 안 됩니다. 각 프로세스에 할당되는 frame 수가 줄어들면 페이지 부재율은 증가하고, 프로세스 실행은 늦어지게 됩니다.

 

9.5.2. 할당 알고리즘(Allocation of Algorithms)

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

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

 

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

다수의 프로세스가 frame 할당을 위해 경쟁하는 환경에서 페이지 교체 알고리즘은 크게 두 가지 범주로 나뉩니다.

  • 전역 교체(Global Replacement)
    • 프로세스가 교체할 frame을 다른 프로세스에 속한 frame을 포함한 모든 프레임을 대상으로 찾는 경우
    • 지역 교체 방법에서는 프로세스에 할당된 프레임의 수는 변하지 않습니다.
    • 문제점은 한 프로세스가 그 자신의 페이지 부재율을 조절할 수 없다는 것.
    • 한 프로세스의 페이지 부재율은 그 프로세스가 어떤 프로세스들과 함께 실행되느냐에 영향을 받습니다.
  • 지역 교체 (Local Replacement)
    • 각 프로세스가 자기에게 할당된 frame들 중에서만 교체될 victim을 선택할 수 있는 경우
    • 전역 교체 아래에서는 한 프로세스에 할당된 프레임의 수는 바뀔 수 있습니다.
    • 지역 교체 알고리즘의 경우는 다른 프로세스에게 영향을 받지 않는데, 유일하게 그 프로세스의 페이징 형태에만 영향을 받기 때문입니다.

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

 

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

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


9.6. 스레싱(Thrashing)

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

 

9.6.1. 스레싱의 원인(Cause of Thrashing)

 스레싱은 심각한 성능 저하를 유발합니다. 운영체제는 CPU 이용률을 검사하게 되는 데, 만약 CPU 이용률이 너무 낮아지면 새로운 프로세스를 시스템에 더 추가해서 다중 프로그래밍의 정도를 높입니다. 만약 많은 프로세스들이 실행을 위해 추가의 프레임을 원한다면, 계속해서 페이지 부재가 발생할 것이며, 프로세스들이 페이징 장치를 기다리는 동안 CPU 이용률은 계속해서 떨어진다. CPU 스케줄러는 CPU 이용률이 떨어지는 것을 보고, 계속 새로운 프로세스를 추가하려고 할 것이며 악순환이 반복됩니다. 이에 스레싱이 발생하게 되고, 시스템의 처리율이 상당히 낮아지게 된다.

다중 프로그래밍의 정도가 높아짐에 따라, 계속해서 CPU 이용률이 최댓값까지 증가하기는 하지만, 그 뒤 급격하게 감소하며 스레싱이 일어나게 됩니다. 따라서 최고점에서 다중 프로그래밍의 정도를 낮춰야 합니다. 스레싱은 지역 교환 알고리즘이나 우선순위 교환 알고리즘을 사용하면 제한할 수 있습니다. 지역 교환 알고리즘을 사용하면, 한 프로세스가 스레싱을 유발하더라도 다른 프로세스로부터 frame을 뺏어올 수 없으므로, 다른 프로세스는 스레싱으로부터 자유로울 수 있습니다.

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

 

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

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

 

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

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

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


9.7. Memory-Mapped File

open(), write() system call을 사용하여 디스크에 있는 파일을 순차적으로 읽는다고 가정했을 때, 이러한 방식을 사용하면 파일이 매번 access 될 때마다, system call을 해야 합니다. 이와 같이 하는 대신에 디스크 입출력을 메모리 참조 방식으로 대신할 수 있습니다. 이러한 방식을 메모리 사상(memory-mapping)이라고 합니다.


9.8 커널 메모리의 할당

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

  1. 커널은 다양한 크기의 자료 구조를 위해 메모리를 할당받습니다. 이 자료구조들은 페이지 크기보다 작은 크기를 갖기도 합니다. 때문에 커널은 메모리를 조심스럽게 사용하여야 하고, 단편화에 의한 낭비를 줄여야 합니다.
  2. 사용자 모드 프로세스에 할당되는 페이지는 물리 메모리 상에서 꼭 연속적일 필요가 없습니다. 하지만, 특정 하드웨어 장치는 물리적으로 연속적인 메모리를 요구할 수 있습니다.

9.8.1. 버디 시스템

버디 시스템은 물리적으로 연속된 페이지들로 이루어진 고정된 크기의 세그먼트로부터 메모리를 할당합니다. 메모리는 이 세그먼트로부터 2의 거듭제곱 단위로 할당됩니다. 예를 들어 11KB가 요청되면, 16-KB 세그먼트가 할당됩니다.

 버디 시스템의 장점 중 하나는 합병(Coalescing)라고 부르는 과정을 통해 서로 인접한 버디들이 손쉽게 하나의 큰 세그먼트로 합쳐질 수 있다는 점입니다. 버디 시스템의 분명한 단점은 2의 거듭제곱 단위로 메모리를 할당받기 때문에, 단편화를 불러올 수 있습니다.

9.8.2. 슬랩 할당(Slab Allocation)

두 번째 커널 메모리 할당 정책은 슬랩 할당입니다. 슬랩(Slab)은 하나 이상의 연속된 페이지들로 구성되어 있으며, 캐시(Cache)는 하나 이상의 슬랩들로 구성됩니다.


9.9. 기타 고려 사항

9.9.1. 프리 페이징(PrePaging)

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

 

9.9.2. 페이지 크기(Page Size)

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

 

9.9.3. 역 페이지 테이블(Inverted Page Table)

8.6.3절에서 역 페이지 테이블의 목적은 페이지 테이블이 차지하는 메모리 공간을 줄이기 위함이었습니다. 이 테이블은 <process-id, page-number>의해 index 되며, 물리 메모리마다 한 항목을 갖습니다. 각 페이지 프레임에 어떤 가상 메모리 페이지가 저장되어 있는지의 정보만 유지하면 되기 때문에 필요한 물리 메모리 양을 줄입니다. 이 밖에도 프로그램 구조, 입출력 상호 잠금과 페이지 잠금 등을 고려해야 합니다.