Search

Chapter 10. 가상 메모리

생성일
2023/07/01 01:00
태그

배경

잘 발생하지 않는 오류 상황을 처리하는 코드나 실제 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)를 프레임마다 두고 해당 프레임이 잠기면 교체 대상에서 배제하는 것이다.