메인 메모리의 크기는 물리적으로 한정되어 있으며, 따라서 메인 메모리의 크기보다 크기가 큰 프로세스는 실행할 수가 없다. 이를 해결하기 위해 등장한 메모리 관리 기법이 바로 가상 메모리(Virtual memory)이다.
가상 메모리는 보조기억장치(HDD 등)의 일부를 마치 주기억장치, 즉 메모리처럼 활용하도록 함으로써 실제 주기억장치보다 더 큰 메모리 영역을 제공하는 방법이다. 즉, 주기억장치의 속도와 보조기억장치의 용량이라는 장점을 모두 얻을 수 있도록 하는 방법인 것이다.
가상 메모리의 핵심은 어떤 프로세스가 동작할 때 메모리에 해당 프로세스 전체가 올라가지 않아도 되고, 실행에 필요한 일부분만 메모리에 올라간다
는 것이다. 즉, 프로세스의 데이터 중 현재 실행을 위해 필요한 중요 부분만을 메모리에 적재하고 나머지 덜 중요한 부분은 가상 메모리(보조기억장치)에 옮겨 둠으로써 메모리의 효율성을 높이는 것이다. 이를 요구 페이징(Demand paging)
이라 한다.
이름에서 알 수 있듯 요구 페이징 기법에서 프로세스를 나누는 방식이 앞서 메모리 할당 포스트에서 살펴본 페이징
기법이다.
- 페이징(Paging)
프로세스의 주소 공간을 고정된 크기의 페이지 단위로 나누어 메모리의 프레임에 불연속적으로 할당하는 방법이다. 페이지와 프레임을 대응시키는페이지 매핑(Page mapping)
을 위한페이지 테이블(Page table)
이 필요하며, 여기에는 각 페이지의 번호와 해당 페이지가 할당된 프레임의 시작 물리 주소가 저장된다.
그리고 페이징 기법에서는 프로세스의 구분 단위인 페이지
와 실제 물리적 메모리 공간의 구분 단위인 프레임
을 매칭하며, 이때 페이지에 주어지는 주소가 논리적 주소(Logical address)
, 프레임에 할당되는 주소가 물리적 주소(Physical address)
이다. 앞서 주소 바인딩에서 정리했던 개념이 이렇게 활용되는 것.
요구 페이징 방식을 통해 현재 실행에 필요한 페이지만을 메모리에 적재하고, 나머지 덜 중요한 페이지는 보조기억장치의 '가상 메모리 공간'에 저장해 두게 된다. 따라서 CPU가 프로그램을 실행하면서 현재 필요로 하는 페이지가 물리적 메모리에 존재하지 않는 경우도 발생한다. 이를 페이지 폴트(Page fault)
라고 한다.
페이지 폴트의 발생 과정을 간단히 정리하면 다음과 같다.
페이지 폴트
이면 현재 물리 메모리에 비어 있는 프레임이 있는지 확인한다.여기서 4번 과정을 살펴보자. 만약 스왑 영역에서 페이지를 가져오려고 할 때 물리 메모리에 비어 있는 공간이 없다면 어떻게 될까? 프로세스를 멈출 수는 없으므로 OS는 희생 프레임(Victim frame)
을 골라 이를 가상 메모리에 저장하고, 그렇게 만들어진 빈 공간에 필요한 페이지를 적재한다. 그리고 이 과정에서 페이지 교체 알고리즘(Page replacement algorithm)
이 사용된다.
페이지 교체 알고리즘(Page replacement algorithm)은 페이지 폴트의 발생 비율을 줄이는 것을 목표로 한다. 따라서 가까운 미래에 참조될 가능성이 '가장 낮은' 페이지를 선택해서 내보내는 것이 성능을 향상시킬 수 있는 방법이 된다.
Belady's anomaly
프레임의 개수가 많아져도 페이지 폴트가 줄어들지 않고 오히려 늘어나는 현상
Local 교체 방식을 채택하면 각 프로세스가 모두 희생 프레임을 선정해 교체를 진행해야 하므로 비효율적일 수 있다. 따라서 일반적으로는 Global 교체가 더 효율적이다.