프로그램의 모든 부분을 메모리에 적재하게 된다면, 메모리의 크기는 한정적이기 때문에 비효율적일 것이다.
실제로는 코드의 일부적인 부분만 프로세스의 실행에 필요할 수 있으며 방어적인 코드와 같이 지금 당장 메모리에 올려도 되지 않는 코드들이 존재하기 때문이다.
따라서 프로세스 실행에 필요한 일부분의 코드만 메모리에 올리고, 나머지 부분은 디스크에 임시적으로 저장하며 필요할 때에 메모리로 올려서 사용하는 기술을 가상 메모리라고 한다.
가상 메모리를 사용하면 결과적으로 더 많은 프로세스를 메모리에 올릴 수 있기 때문에 효율적으로 메모리를 관리할 수 있다.
가상메모리를 구현하기 위해서는 MMU(Memory Management Unit)가 필요한데, 최근 아키텍처에는 CPU 코어안에 탑재된다.
MMU가 수행하는 역할은 다음과 같다.
요구 페이징이란 프로세스 실행 중 특정 페이지가 실제로 필요할 때 메모리에 올리는 것이다.
구현을 위해서는 페이지 테이블이 필요하다.
페이지 테이블의 인덱스는 페이지 번호를, 배열에 담고있는 숫자가 매핑할 프레임을 나타낸다.
가상 메모리의 일부분만 실제 메모리에 적재되기 때문에 메모리에 해당 페이지가 적재되어 있는지를 알아야 하는데, 이는 페이지 테이블의 vaild-invaild bit를 사용하여 구현한다.
vaild는 현재 메모리에 해당 페이지가 적재되어 있다는 것, invaild는 디스크의 swap 영역에서 메모리에 적재되기 위하여 대기 중이라는 것을 의미한다.
만약 프로세스 실행 중 invalid인 페이지가 필요하면, Page Fault 트랩이 발생한다.
Page Fault 처리 과정은 다음과 같다.