Virtual Memory (가상 메모리)는 운영체제가 각 프로세스 (Process)에게 자신만의 독립적인 주소 공간을 제공하기 위해 사용하는 메모리 관리 시스템이다.

가상 메모리는 주로 페이징 (Paging)을 통해 구현되며, 과거엔 Segmentation과 결합되기도 했다.

CPU는 물리 메모리가 아닌 가상 주소만을 사용하며,
메모리 접근은 Memory Management Unit (MMU)Page Table (1-Level Page Table)을 통해 물리 주소로 변환된다.

그렇다면 가상 메모리를 쓰는 이유는 무엇일까?
가상 메모리는 운영체제의 핵심 디자인인 메모리의 보호, 독립, 공유를 달성한다.
좀 더 자세히 이 3가지 디자인이 어떻게 적용되고, 어떤 이점을 가져다주는지 알아보자.

1. 주소 공간 독립

가상 메모리를 사용하면 Process마다 독립적인 주소 공간을 제공할 수 있게 된다.
즉, 가상 메모리 기술을 통해 프로세스 A의 0x400000 주소와 프로세스 B의 0x400000 주소가 서로 다른 메모리가 될 수 있다.

이렇게 되면, 2가지 이점이 생긴다.
1번째 이점은 프로세스마다 고유한 가상 주소 공간을 할당하기 때문에 다중 프로세스의 실행이 가능해진다.
2번째 이점은 각 프로세스가 독립된 가상 메모리 주소 공간을 가지게 되므로, 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 막을 수 있다.

2. 메모리 가상화

가상 메모리에서 디스크는 프로세스의 가상 메모리 페이지를 저장하는 백업 저장소 역할을 하고, RAM은 그 중 현재 사용 중인 페이지들의 캐시 역할을 한다. (Demand Paging)

예시

A 프로세스가 10GB의 가상 메모리를 사용한다고 해보자.
그러나 A 프로세스를 실행해야 하는 컴퓨터의 RAM은 4GB뿐이다.

“A 프로세스를 실행하면 10GB의 메모리를 사용하므로 프로그램을 못 돌리지 않을까”
라고 생각할 수 있겠지만, 가상 메모리 기술을 사용하면 상황이 달라지게 된다.

컴퓨터의 입장에선 A 프로세스가 실행될 때,
지금 사용하는 200MB만 RAM에 있고, 나머지는 디스크에 있게 된다.
추가 메모리는 지연 로딩(Demand Paging)을 통해 디스크에서 RAM으로 로드된다.

예시를 통해 알 수 있듯이, 가상 메모리 기술을 사용하면 프로세스가 현재 필요한 부분만 RAM에 적재하기 때문에 메모리를 효율적으로 사용할 수 있다는 장점이 있다.
반면에 프로세스가 RAM에 적재되지 않은 페이지를 요구할 경우에는 디스크에서 RAM으로 적재하는 과정이 필요하기 때문에 속도가 느려질 수 있다는 단점 또한 존재한다.

3. 페이지 단위의 메모리 보호

가상 메모리가 페이징을 사용해 동작할 경우, 메모리의 단위는 페이지(통상적으로 4KB)가 된다.
이 페이지 단위로 메모리의 권한을 통제할 수 있게 되므로 메모리의 보호가 수월해지게 된다.

예시로 0x401000 ~ 0x402000은 코드 영역, 0x404000 ~ 0x405000은 BSS 영역이라고 해보자.

코드 영역은 r-x 권한을 요구하고, BSS 영역은 rw- 권한을 요구한다.
이때, 가상 메모리 기술을 통해 페이지 단위로 권한 관리가 가능해지므로
각 페이지에 필요한 권한을 줄 수 있다.