배경
•
잘 발생하지 않는 오류 상황을 처리하는 코드나 실제 10정도만 사용되는데 100만큼 할당된 자료구조와 같은 비효율적인 상황에서, 프로그램을 일부분만 메모리에 올려놓고 실행시키는 것은 다음과 같은 이점을 가진다.
◦
프로그램이 물리 메모리의 크키에 제약을 받지 않는다.
◦
프로그램이 더 적은 메모리를 차지하므로 더 많은 프로그램을 동시에 수행할 수 있다.
◦
프로그램을 메모리에 올리고 swap하는 과정이 줄어들어 빨라진다.
•
가상 메모리는 실제 물리 메모리와 논리 메모리 개념을 분리하여, 적은 메모리를 통해 큰 가상 주소 공간을 사용할 수 있게 한다.
•
한 프로세스의 가상 주소 공간은 해당 프로세스가 메모리에 저장되는 논리 주소를 말한다.
•
가상 메모리는 논리 메모리를 물리 메모리로부터 분리해주는 것 이외에도, 페이지 공유를 통해 파일이나 메모리가 둘 이상의 프로세스에 공유할 수 있다.
요구 페이징
•
요구 페이징(Demand paging) 기법은 프로그램을 메모리에 올릴 때 필요한 페이지만 적재하는 방법으로, 가상 메모리 시스템에서 일반적으로 사용된다.
•
요구 페이징 기법을 사용하면 접근 되지 않은 페이지는 물리 메모리에 로드되지 않고, 프로그램 실행 중에 필요할 때만 페이지가 로드된다.
1.
기본 개념
•
기본 개념은 필요한 경우에만 페이지를 메모리에 적재하는 것으로, 메모리에 적재되어 있는 페이지를 구분하기 위해 유효-무효(valid-invaild) 비트 기법이 사용될 수 있다.
•
유효하다는 것은 해당 페이지가 메모리에 있다는 것이고, 무효하다는 것은 해당 페이지가 가상 주소 공간상에 정의 되지 않았거나 유효하지만 보조저장장치에 존재한다는 것을 의미한다.
•
프로세스가 메모리에 올라와있지 않은 페이지(무효인 페이지)에 접근하려하면, 페이지 폴트 트랩(page-fault trap)을 발생시킨다.
•
극단적인 경우에는 메모리에 페이지가 단 하나도 올라와있지 않고 프로세스를 실행시킨 후, 프로세스를 수행하면서 모든 페이지가 메모리에 올라오기까지 계속해서 페이지 폴트가 발생한다.
•
이렇게 페이지가 필요해지기 전에 해당 페이지를 메모리에 절대 올리지 않는 방법을 순수 요구 페이징(pure demand paging)이라 한다.
•
연속된 페이지 폴트는 시스템 성능의 저하를 유발하지만, 모든 프로그램은 참조의 지역성(locality of reference)라는 성질이 있어 프로그램의 특정 부분만 집중적으로 참조하기 때문에 요구 페이징 기법은 충분한 성능을 보여준다.
•
요구 페이징 기법은 페이징과 스와핑을 위한 하드웨어가 필요하다.
◦
페이지 테이블 : 보호 비트나 유효/무효 비트를 통해 특정 항목을 무효 설정 가능해야한다.
◦
보조저장장치 : 모든 페이지를 가지고 있는 스왑 공간(swap space)을 제공할 스왑 장치가 있어야 한다.
2.
가용 프레임 리스트
•
페이지 폴트가 발생하면 운영체제는 요청된 페이지를 보조저장장치에서 메인 메모리로 가져오는데, 대부분의 운영체제는 가용 프레임 리스트를 유지하여 이를 지원한다.
•
가용 프레임 리스트는 사용되지 않고 비어있는 프레임들을 리스트로 유지하는 것인데, 프로세스에서 메모리에 로드할 때 해당 리스트에서 프레임을 꺼내 페이지를 할당한다.
•
zero-fill-on-demand 기법은 페이지 폴트가 발생하여 페이지를 가져와 메모리에 로드하기 직전에, 해당 페이지의 값들을 0으로 초기화하여 보안 및 개인정보를 보호하는 기법이다. 가용 프레임 리스트에서 가용 프레임을 할당할 때 해당 기법을 사용한다.
쓰기 시 복사(Copy-on-Write)
•
fork()를 통해 부모 프로세스에서 자식 프로세스를 만들 때, 부모 프로세스의 모든 것을 복사해서 만든다. 하지만 자식 프로세스에서 exec() 시스템 콜을 하게 되면 복사한 데이터들 전부 사용하지 않게 된다.
•
이런 점을 개선하기 위해 부모 페이지를 복사해오는 대신, 부모의 페이지를 자식 페이지가 공유할 수 있게 하고 실제 데이터가 수정될 때 해당 페이지를 복사하는 쓰기 시 복사(copy-on-write) 방식을 사용한다.
페이지 교체
•
메모리에 40 프레임이 있고 10개의 페이지가 필요한 프로세스가 있다면 4개의 프로세스만 실행될 수 있지만, 프로세스가 실제로 사용하는 페이지가 5개 뿐이라면 실제로는 8개의 프로세스를 수행할 수 있다.
•
이러한 상황에 프로세스가 10개의 페이지를 모두 사용해야 하는 상황이 오면 메모리 과할당(over-allocating)이 발생할 수 있다. 이렇게 모든 메모리가 사용 중이면 운영체제는 페이지 스와핑과 페이지 교체를 결합하여 사용한다.
1.
기본적인 페이지 교체
•
페이지 교체는 빈 프레임이 없어 할당되지 못하는 상황에서, 현재 사용되지 않는 프레임을 찾아 스왑 공간에 저장하고 해당 페이지를 비운다. 그 후 비워진 프레임에 페이지 폴트를 발생시켜 다른 프로세스 사용할 수 있도록 한다.
•
페이지 교체를 위해 하드디스크에 프레임을 스왑아웃하고 새로운 프로세스의 페이지를 찾아 읽는 2번의 과정이 발생해 실질 접근 시간이 증가한다.
•
이와 같은 오버헤드를 변경 비트(modify bit 혹은 dirty bit)를 사용해 감소시킬 수 있다.
•
페이지 내에 어떤 변경이라 발생하면 변경 비트가 설정된다. 페이지 변경 시 희생 페이지가 결정되면 해당 페이지의 변경 비트를 확인하고, 변경 비트가 설정되어있지 않다면 보조저장장치에 저장되어있는 값과 다르지 않다는 의미로 페이지를 스왑 아웃할 필요가 없다.
•
위 과정은 I/O 시간을 반으로 줄일 수 있기 때문에 페이지 폴트 처리 시간을 상당히 줄일 수 있다.
•
요구 페이징 기법은 이런 페이지 교체를 통해 논리적 메모리와 물리 메모리를 분리하고, 적은 물리 메모리로 넉넉한 가상 메모리를 제공할 수 있다.
•
요구 페이징 시스템은 프레임 할당(frame-allocation) 알고리즘으로 각 프로세스에 얼마나 많은 프레임을 할당해야 하는지 결정해야하고, 페이지 교체(page-replacement) 알고리즘으로 페이지 교체 시에 어떤 페이지를 교체할 것인지 결정해야한다.
2.
FIFO 페이지 교체
•
FIFO(First-In First-Out) 알고리즘은 가장 간단한 페이지 교체 알고리즘으로, 메모리에 올라온 가장 오래된 페이지부터 희생시키는 방식이다.
•
개념적으로나 구현적으로나 간단하고 쉽지만, 성능 향상 측면에서는 별로 좋지 않다.
•
프로세스에 할당하는 프레임 개수를 늘렸지만 오히려 페이지 폴트가 더 자주 발생하는 Belady의 모순(Belady’s anomaly) 현상이 발생할 수 있다.
3.
최적 페이지 교체(OPT 알고리즘)
•
앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 방식의 알고리즘이다.
•
Belady의 모순을 개선하기 위해 나온 알고리즘으로, 모든 알고리즘 중 가장 낮은 페이지 폴트율을 보이고 Belady의 모순이 발생하지 않는다.
•
프로세스가 앞으로 어떤 메모리를 참조해야 하는지 미리 알아야 한다는 점 때문에, 최적 페이지 교체 알고리즘은 실제 구현이 어렵다.
4.
LRU 페이지 교체
•
OPT 알고리즘은 페이지가 사용될 시간을 예측하기 어려워 사용되지 않는다는 점에서 착안하여, LRU(least-re-cently-used) 알고리즘은 최근의 과거를 미래의 근사치로 사용하여 가장 오랫동안 사용되지 않을 페이지를 교체하는 방식이다.
•
페이지마다 마지막 사용시간을 유지하고, 가장 오랫동안 사용되지 않은 페이지를 희생 페이지로 선택한다.
•
LRU 알고리즘은 최근 사용된 시간 순서로 파악할 수 있도록 하드웨어적 지원이 필요하다.
◦
계수기(counters)
▪
페이지 항목마다 사용 시간 필드를 넣고 CPU에서 논리적인 시계나 계수기를 추가하여 마지막 참조 시간을 유지하는 방식이다.
▪
가장 간단한 방법이지만, LRU 페이지를 찾기 위해 페이지 테이블을 탐색해야하고 메모리 참조 시마다 메모리 쓰기 작업을 해야한다는 단점이 있다.
◦
스택(stack)
▪
페이지가 참조될 때마다 페이지 번호를 스택 중간에서 빼서 스택 top에 위치시키는 방법으로, 가장 최근에 사용한 페이지부터 가장 오랫동안 사용되지 않은 페이지까지 나타내는 방법이다.
▪
스택 중간에서 값을 제거할 필요가 있기 때문에 double-linked-list로 구현한다.
•
계수기와 스택 모두 구현하기 위해서는 메모리 참조 때마다 계수기 값이나 스택을 갱신해야하기 때문에, TLB 레지스터 이상의 하드웨어 지원이 필요하다.
5.
LRU 근사 페이지 교체
•
페이지 참조가 발생할 때마다 하드웨어가 해당 페이지에 대한 참조 비트(reference bit)를 1로 설정하여, 0으로 초기화 된 참조 비트들 중 어떤 페이지가 한번도 사용되지 않았는지 알아내는 방법이다.
•
LRU 페이지 교체는 하드웨어의 지원이 필요하기 때문에, 하드웨어 지원이 불가능한 시스템에서 사용되기 위한 알고리즘이다.
•
부가적 참조 비트(Additional-Reference Bits) 알고리즘
◦
각 페이지에 8비트의 참조 비트를 할당하고, 일정한 간격마다 참조 비트들을 기록하여(비트 시프트를 통해) 추가적인 선후 관계 정보를 알아내는 방식이다.
•
2차 기회(Second-Chance) 알고리즘
◦
FIFO 알고리즘을 기반으로 페이지를 선택할 때마다 참조 비트를 확인하여, 0이면 페이지를 교체하고 1이면 다음 FIFO 페이지로 넘어가는 방식이다.
◦
다음 FIFO 페이지로 넘어갈 때, 스킵되는 페이지는 참조 비트가 해제되고 현재 시간으로 재설정된다.
•
개선된 2차 기회(Enhanced Second-Chance) 알고리즘
◦
참조 비트에 변경 비트를 추가하여 4가지 등급으로 나누어 적용하는 방식이다.
◦
(0, 0) : 최근에 사용되지 않았고 데이터도 변경되지도 않음
→ 교체 우선 대상
◦
(0, 1) : 최근에 사용되지 않았지만 데이터가 변경 됨
→ 디스크에 변경 사항을 기록해야하기 때문에 페이지 교체에 적합하지 않음
◦
(1, 0) : 최근에 사용되었지만 데이터는 변경되지 않음
→ 곧 다시 사용될 가능성이 높은 페이지
◦
(1, 1) : 최근에 사용되었고 데이터도 변경 됨
→ 곧 사시 사용될 가능성이 높고 페이지 교체 시 디스크에 기록해야 함
◦
페이지 교체 시 페이지의 등급을 확인하고 가장 낮은 등급을 가지는 첫 페이지를 교체한다.
6.
계수-기반(Counting-Based) 페이지 교체
•
계수기를 사용한 페이지 교체 알고리즘은 두 가지가 있다.
◦
LFU 알고리즘
▪
LFU(least Frequently Used) 알고리즘은 참조 횟수가 가장 적은 페이지를 교체하는 방법이다.
▪
이 알고리즘은 초기에는 한 페이지를 자주 사용하지만 그 이후로 다시 사용하지 않는 경우처럼 판단이 빗나갈 수 있다.
◦
MFU 알고리즘
▪
MFU(Most Frequently Used) 알고리즘은 참조 횟수가 가장 적은 페이지가 가장 최근에 참조된 것이고 앞으로 사용될 것으로 판단하여 페이지를 교체하는 알고리즘이다.
•
LFU와 MFU는 구현하는데 비용이 많이 들고, OPT 알고리즘을 제대로 근사하지 못하기 때문에 잘 사용되지 않는다.
7.
페이지-버퍼링(Page-Buffering) 알고리즘
•
페이지 교체 알고리즘과 병행하여 여러 버퍼링 기법이 사용될 수 있다.
•
교체될 페이지가 선택되면 해당 페이지의 내용을 디스크에 쓸 때까지 기다리지 않고, 가용 프레임 풀(pool)에서 꺼낸 가용 프레임에 새로운 페이지를 먼저 읽어오는 방법이 있다.
•
다른 방법으로는 가용 프레임 풀을 유지하지만, 가용 프레임 풀에 있는 각 프레임을 사용했었던 원래의 페이지를 기억해 놓는 방법이 있다. 풀 속의 프레임이 수정되지 않았을 확률이 존재하기 때문에 해당 프레임이 다른 페이지에 사용되기 전까지는 다시 사용될 수 있다.
8.
어플리케이션과 페이지 교체
•
나름의 메모리 관리와 I/O 버퍼링을 수행하고 있는 데이터베이스 같은 경우에는 페이지 버퍼링을 전혀 사용하지 않는 경우에 비해 성능이 떨어질 수 있다.
•
데이터웨어하우스는 연속적인 대량의 읽기 작업 이후에 계산과 쓰기 작업을 수행하는데, LRU 알고리즘은 오래된 페이지를 버리기 때문에 이 경우에는 MFU가 더 효율적일 수 있다.
•
이와 같은 문제들 때문에, 일부 운영체제에서는 보조저장장치 파티션을 파일 시스템 구조가 아닌 단순 논리 블록의 배열로 사용할 수 있도록하는 raw disk 기능을 갖추고 있다.
•
파일 시스템의 요구 페이징, 파일 잠금, 선반입, 공간 할당, 디렉터리, 파일 이름 등의 모든 파일 시스템 서비스를 거치지 않고, 자신만의 특수한 저장장치 서비스를 구현하여 더 효율적으로 사용할 수 있도록 한다.
프레임의 할당
1.
최소로 할당해야 할 프레임의 수
•
각 프로세스에 할당되는 프레임의 수가 줄어들면 페이지 폴트율이 증가하고 그로 인한 성능 저하가 발생한다.
•
이를 막기위한 최소 프레임 수는 컴퓨터 아키텍처에 의해 정해진다. 반대로 최가 프레임 수는 물리 메모리 양에 의해 정해진다.
2.
할당 알고리즘
•
m개의 가용 프레임을 n개의 프로세스에 모두 똑같이 m/n 프레임씩 나누어주는 방법을 균등 할당(equal allocation)이라 한다.
•
비례 할당(proportional allocation) 방식은 큰 프로세스에는 많은 프레임을 할당하고 작은 프로세스에는 적은 프레임을 할당하는 방법이다. 각 프로세스의 크기에 맞춰 비율로 할당한다.
3.
전역 할당 vs 지역 할당
•
전역 교체(global replacement)는 교체할 프레임을 고를 때, 자신을 포함한 모든 프로세스들에 속해있는 프레임들 모두를 대상으로 하는 방법이다.
•
지역 교체(local replacement)는 교체할 프레임을 자기 프로세스에 속한 프레임들을 대상으로 하여 고르는 방법이다.
•
전역 교체 알고리즘의 문제점은 다른 프로세스의 페이징 동작에 의해 성능에 영향을 받는다는 것이다.
•
지역 교체 알고리즘은 잘 사용되지 않는 페이지 프레임이 있더라도 그대로 낭비될 수 있다는 문제가 있다.
•
일반적으로 전역 교체 알고리즘이 지역 교체 알고리즘보다 성능이 좋으며, 그로 인해 더 많이 사용된다.
•
전역 교체 방식에서 가용 프레임 리스트 항목이 0이 되기 전부터 페이지 교체를 요청하고 특정 임계값이 넘으면 페이지 교체를 중지하는, 커널 리퍼(reaper)라 불리는 방식이 사용될 수 있다.
4.
비균등 메모리 접근
•
비균등 메모리 접근(NUMA, Non-Uniform Memory Access) 시스템에서 CPU와 메모리의 연결 방식에 따라 메모리의 특정 영역을 다른 영역보다 빠르게 접근 가능하다.
•
이런 시스템에서는 메모리에 프레임을 할당할 때 해당 프로세스가 실행 중인 CPU에 가장 가까운 메모리의 프레임을 할당하도록 한다.
스래싱(Thrashing)
•
스래싱(thrashing)은 프로세스에 충분한 프레임이 없고 페이지 교체가 필요하지만 자주 사용되는 페이지들만으로 이루어져있다면 어떤 페이지로 교체가 되든 반복해서 페이지 폴트가 발생하고 페이지를 교체하는 과도한 페이징 작업을 의미한다.
a.
스레싱 원인
•
CPU의 이용률이 떨어지는 경우 CPU는 새로운 프로세스를 시스템에 추가하여 CPU 이용률을 높이려하는데, 페이지 폴트가 너무 자주 발생하는 경우에도 CPU의 이용률이 떨어지고 CPU에서 새로운 프로세스가 추가해 더 자주 페이지 폴트가 발생하는 스레싱이 발생할 수 있다.
•
지역 교체 알고리즘이나 우선순위 교체 알고리즘을 사용하면 스래싱의 영향을 제한할 수 있다. 하지만 하나의 프로세스에서 스래싱이 발생하면 페이징 장치 큐에 대기열이 길어지기 때문에, 다른 스래싱 되지 않은 프로세스에서도 실질 접근 시간이 증가한다.
•
지역성 모델(locality model)이란 프로세스가 실행될 때 특정 지역에서만 메모리를 집중적으로 참조하는 것을 말하는데, 해당 모델을 기반으로 스래싱 현상을 방지하기 위한 최소 프레임 개수를 추정할 수 있다.
b.
작업 집합 모델
•
작업 집합 모델(working-set model)은 최근 몇 번동안 참조한 페이지를 관찰하여 작업 집합으로 유지하고, 특정 페이지가 더 이상 사용되지 않고 n번의 다른 페이지들의 참조가 발생하면 해당 페이지는 작업 집합에서 제외한다.
•
작업의 정확도는 n에 따라 달라지는데, 너무 작으면 전체 지역을 포함하지 못하고 너무 크면 여러 지역성을 과도하게 수용하게 된다.
c.
페이지 폴트 빈도
•
페이지 폴트가 자주 발생한다는 것은 해당 프로세스에 프레임이 더 필요하다는 의미이고, 페이지 폴트율이 낮은 경우에는 해당 프로세스에 많은 프레임이 할당되어 있다는 의미이다.
•
페이지 폴트 빈도(Page Fault Frequency) 방식은 위의 페이지 폴트율과 프레임의 수의 상관관계를 통해, 페이지 폴트율의 상한과 하한을 정해 프레임을 추가 할당하거나 회수하는 방식이다.
메모리 압축
•
메모리 압축(Memory Compression)은 수정된 프레임을 스왑 공간으로 페이징 아웃하는 것이 아니라, 여러 프레임을 하나의 프레임으로 압축하여 메모리 사용량을 줄이는 방식이다.
•
모바일 시스템은 스와핑을 지원하지 않기 때문에, 대부분의 모바일 운영체제에서 메모리 압축을 지원한다.
커널 메모리의 할당
1.
버디 시스템
•
버디 시스템은 물리적으로 연속된 페이지로 이루어진 세그먼트로부터 2의 거듭제곱 할당기에 의해 할당된다.
•
21KB의 메모리를 할당할 때, 256KB의 세그먼트가 있다면 128KB의 두 개의 버디(buddies)로 나누어지고 그 중 하나를 또 나누어 32KB를 할당하여 처리한다.
•
인접한 버디들은 하나의 큰 세그먼트로 합쳐질 수 있는데, 이를 합병(coalescing)이라 부른다.
•
버디 시스템은 2의 거듭제곱을 올림하여 할당된 메모리로 인해 내부 단편화가 발생한다는 단점이 있다.
2.
슬랩 할당
•
각 커널마다 하나의 캐시가 존재하고, 각 캐시는 커널 자료구조의 인스턴스에 해당하는 객체들로 채워져있는 방법이다.
•
슬랩(slab)은 하나 이상의 연속된 페이지로 구성되고, 캐시(cache)는 하나 이상의 슬랩들로 구성된다.
•
각 커널 자료구조마다 하나의 캐시를 할당하여 사용한다.
•
Full : 슬랩 내의 모든 객체가 used
•
Empty : 슬랩 내의 모든 객체가 free
•
Partial : used, free가 섞여있음
•
슬랩 할당기는 partial 슬랩의 free 객체를 이용해 요청을 처리하려 시도하고, partial이 없으면 empty 슬랩으로부터 free 객체를 할당한다. empty 슬랩도 없으면 새로운 슬랩이 물리 메모리에서 할당되어 캐시에 주어진다.
•
슬랩은 단편화로 낭비되는 메모리가 없고, 메모리 요청이 빠르게 처리된다.
기타 고려 사항
1.
프리페이징
•
순수 요구 페이징은 프로세스가 시작될 때 초기 지역성을 메모리로 가져오려고 시도하기 때문에 페이지 폴트가 많이 발생한다.
•
프리 페이징은 프로세스가 종료되면 작업 집합에 속한 페이지 리스트를 저장해두었다가 다시 해당 프로세스가 시작되면 불러오는 방식으로, 초기 페이징의 과다를 방지한다.
2.
페이지 크기
•
전송 시간은 전송되는 양에 비례하기 때문에, 페이지의 크기가 작으면 전송시간이 빠르다. 하지만 전송 시간은 페이지 탐색 시간이나 지연시간에 비해 무척이나 작기 때문에 더 큰 페이지인 경우가 I/O 시간이 더 줄어든다. 뿐만 아니라 페이지가 작은 경우에는 페이지 폴트가 굉장히 자주 발생할 수 있으며 그로 인해 많은 오버헤드를 유발할 수가 있다.
•
작은 페이지를 사용하는 경우 지역성이 향상되어 프로그램의 지역성을 더 정확히 추적하도록 하고, 실제로 필요한 정보만 선별하여 가져오게 되어 정밀도(resolution)가 좋아진다.
3.
TLB Reach
•
TLB 적중률은 메모리 참조 중 페이지 테이블에 가지 않더라도 TLB상에서 주소 변환할 수 있는 경우의 비율을 말하는데, TLB 항목의 수가 늘어나면 적중률이 높아지지만 TLB에 사용되는 연관 메모리가 비싸고 전력을 많이 소모하기 때문에 쉽지 않다.
•
TLB Reach는 TLB로부터 접근할 수 있는 메모리 공간의 크기를 말하는데, TLB에 있는 항목 수에 페이지 크기를 곱한 값이다. TLB의 크기를 두 배로 늘리면 TLB reach도 두 배로 늘어난다. 또한 페이지의 크기를 늘려도 TLB reach가 늘어나지만 큰 페이지의 경우 단편화 증가할 수 있다.
4.
역 페이지 테이블
•
역 페이지 테이블은 가상-물리 주소 변환을 추적하는데 필요한 물리 메모리 양을 줄이기 위해 사용되는데, 각 페이지 프레임에 어떤 가상 메모리 페이지가 저장되어 있는지 정보만 유지하여 물리 메모리 양을 줄이는 방식이다.
•
역 페이지 테이블이 전체 가상 주소 공간에 대한 정보를 유지하지 않기 때문에 참조된 페이지가 현재 메모리에 없는 경우 문제가 되는데, 이를 위해 프로세스마다 확장된 페이지 테이블을 유지한다.
•
확장된 페이지 테이블은 페이지 폴트 처리과정에서만 읽기 때문에 빠르게 처리될 필요가 없고, 그로 인해 확장된 페이지 테이블 자체가 페이징 될 수도 있다. 이때 페이지 폴트 처리과정에서 확장된 페이지 테이블을 불러오기 위해 또 다른 페이지 폴트가 발생하는 현상이 발생할 수 있다.
5.
프로그램 구조
•
요구 페이징은 사용자가 몰라도 동작하도록 구현되어있지만, 사용자나 컴파일러가 요구 페이징의 특성을 이해하면 성능을 크게 개선할 수 있다.
•
자료구조와 프로그래밍 구조를 잘 선택하여 지역성을 향상시키고 페이지 폴트율과 작업 집합의 페이지 수를 줄일 수 있다.
6.
I/O 상호 잠금(interlock)과 페이지 잠금(locking)
•
I/O 장치 작업을 수행하기 위해 큐에 넣어둔 상태에서, 다른 프로세스에서 페이지 폴트가 발생하여 I/O 장치의 버퍼메모리를 포함한 페이지를 교체하면 I/O 작업이 의도치 않게 동작한다.
•
이러한 문제를 해결하는 방법은 사용자 공간에는 I/O를 하지 않는 방법과, 메모리를 잠금(lock)하는 방법이 있다.
•
사용자 공간에 I/O를 사용하지 않고 시스템 버퍼와 사용자 버퍼 사이에서 데이터를 옮기도록 하여 해당 문제를 해결할 수 있지만 데이터가 두 번 움직이여야 하기 때문에 오버헤드가 발생한다.
•
메모리를 잠금하는 것은 잠금 비트(lock-bit)를 프레임마다 두고 해당 프레임이 잠기면 교체 대상에서 배제하는 것이다.