다중 프로그래밍을 실현하기 위해서는 많은 프로세스들을 동시에 메모리에 올려두어야 한다.
가상 메모리는 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이며, 프로그램이 물리 메모리보다 커도 된다는 주요 장점이 있다.
실행되는 코드의 전부를 물리 메모리에 존재시켜야 했고, 메모리 용량보다 큰 프로그램은 실행시킬 수 없었다. 또한, 여러 프로그램을 동시에 메모리에 올리기에는 용량의 한계와, 페이지 교체등의 성능 이슈가 발생하게 된다. 또한, 가끔만 사용되는 코드가 차지하는 메모리들을 확인할 수 있다는 점에서, 불필요하게 전체의 프로그램이 메모리에 올라와 있어야 하는게 아니라는 것을 알 수 있다.
가상 메모리는 실제의 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것으로 정리할 수 있다. 이로써 작은 메모리를 가지고도 얼마든지 큰 가상 주소 공간을 프로그래머에게 제공할 수 있다.
fork()
를 통한 프로세스 생성 과정에서 페이지들이 공유되는 것을 가능하게 한다.프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요로 하는 것들만 적재하는 전략을 요구 페이징 이라고 하며, 가상 메모리 시스템에서 많이 사용된다.
그리고 가상 메모리는 대개 페이지로 관리된다. 요구 페이징을 사용하는 가상 메모리에서는 실행과정에서 필요해질 때 페이지들이 적재된다. 한번도 접근되지 않은 페이지는 물리 메모리에 적재되지 않는다.
프로세스 내의 개별 페이지들은 페이저에 의해 관리된다. 페이저는 프로세스 실행에 실제 필요한 페이지들만 메모리로 읽어 옮으로써, 사용되지 않을 페이지를 가져오는 시간낭비와 메모리 낭비를 줄일 수 있다.
페이지 교체
요구 페이징에서 언급된 대로 프로그램 실행 시 모든 항목이 물리 메모리에 올라가지 않기 때문에, 프로세스의 동작에 필요한 페이지를 요청하는 과정에서 page fault가 발생하게 되면, 원하는 페이지를 보조저장장치에서 가져오게 된다.
하지만, 만약 물리 메모리가 모두 사용중인 상황이라면, 페이지 교체가 이루어져야 한다.
물리 메모리에 모두 사용중인 상황에서의 메모리 교체 흐름
(First-In-First-Out) 즉, 물리 메모리에 먼저 들어온 페이지 순서대로 페이지 교체 시점에 먼저 나가게 된다.
Belady의 모순을 확인한 이후 최적 교체 알고리즘에 대한 탐구가 진행되었고, 모든 알고리즘 보다 낮은 페이지 부재율을 보이며 Belady의 모순이 발생하지 않는다.
앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체 하는 것이다.
LRU = Least-Recently-Used
최적 알고리즘의 근사 알고리즘으로, 가장 오랫동안 사용되지 않은 페이지를 선택하여 교체
LFU = Least Frequently Used
참조횟수가 가장 적은 페이지를 교체하는 방법이다. 활발하게 사용되는 페이지를 참조횟수가 많아질 거라는 가정에서 만들어진 알고리즘
MFU = Most Frequently Used
참조횟수가 가장 적은 페이지가 최근에 메모리에 올라왔고, 앞으로 계속 사용될 것이라는 가정에 기반
MMU