가상 메모리
가상 메모리(Virtual Memory)는 컴퓨터의 주기억 장치(Main Memory)를 CPU 상에서 돌아가는 모든 프로세스들이 공유할 수 있도록 물리적인 메모리에 적절히 할당할 수 있도록 추상적인 메모리 공간을 프로세스들에게 부여하는 기법이다. 하드웨어로는 MMU(Memory Management Unit) 등의 가속 장치만 제공하고 운영체제 별로 적절하게 매핑하는 알고리즘을 사용하여 메모리 관리법을 단순화하고 프로세스 간의 메모리 공간 침범을 방지하여 잔여 메모리 용량과 메모리 공간 안정성을 보장할 목적으로 현대 컴퓨터 운영체제들이 적극적으로 이용하고 있다.
작동 방식
가상 메모리의 구현은 크게 세그먼테이션과 페이징으로 나뉜다.
세그먼테이션은 메모리 공간을 용도에 따라 나누는 방법이다. 코드, 데이터, 스택 등의 세그먼트 공간을 두고 프로그램을 메인 메모리에 적재할 때 자신이 실행하는 프로그램을 용도별로 나누어 해당하는 세그먼트 공간에 배치한다. 만일 데이터를 일고 쓸 때 지정된 세그먼트 공간의 범위를 넘으면 세그먼테이션 폴트가 발생한다. 이 방식은 현재 단편화 해결이 어렵다는 문제로 구식 취급되어 페이징으로 대체된 메인 메모리 공간 관리 방식이 되었다.
페이징은 2의 제곱수 바이트(보통 4KB~1GB 사이)로 일정한 메모리 공간 단위인 페이지 프레임으로 메모리 공간을 분할한 다음 개별 페이지들을 관리하는 페이지 테이블을 프로세스들에게 각각 줘서 프로그램을 메인 메모리에 적재할 때 용도에 따라 페이지 주소를 테이블에서 찾고 플래그를 설정하여 해당 페이지의 특성과 용도(예: 코드가 적재된 페이지는 읽기만 가능하도록 세팅)를 정할 수 있다. 페이지는 세그먼테이션과 달리 순차적으로 실행해야 하는 코드를 메모리 공간에 불연속적으로 배치할 수 있어 메모리 공간 관리의 자유도가 높고, 외부 단편화에 한해[1] 메모리 공간을 낭비하는 일을 없앨 수 있으며 페이지를 디스크로 스왑하는 방식으로 더 많은 프로그램을 한 번에 실행할 수 있다.
페이지 테이블의 경우 x86 같은 PTBR, PTLR 같은 특수 레지스터로 위치와 사이즈를 정하고 Process Context Block에 저장되어 컨텍스트 스위치가 발생할 때 교체되며 페이지 주소를 비트 단위로 나누어 멀티 레벨 페이지 테이블 구조로 만들 수 있다. 이러면 계층적인 메모리 공간 관리가 가능하여 넓은 범위의 메모리 공간과 좁은 범위 또는 개별 페이지의 메모리 공간의 특성을 따로 설정할 수 있으며, 페이지 테이블로 표시할 수 있는 메모리 공간 특성 세팅 가짓수를 늘릴 수도 있다.
덤으로 페이징 기법은 최소 메모리를 2번 접근해야 하므로(실제로 접근할 메모리 위치에 더해 페이지 테이블들에 접근하는 사이클이 추가된다) 페이지 테이블을 캐싱하는 SRAM인 Translation Lookaside Buffer(TLB)라는 특수한 캐시 메모리를 CPU에서 지원하는 경우가 있다.
페이지 교체 알고리즘
메모리 스왑(디스크 스왑)
- ↑ 내부 단편화는 발생 가능하기에 주로 적재하는 프로그램 특성에 페이징 단위를 최대한 맞추는 것으로 단편화의 최소화만 가능하다