모든 이야기

가상 메모리: 프로그램이 보는 주소와 실제 RAM이 다른 이유

프로그램에서 출력한 포인터는 대개 RAM 칩의 실제 위치를 그대로 나타내지 않는다. 가상 메모리는 프로세스가 사용하는 주소 공간을 실제 물리 메모리와 분리해 관리하는 체계다. 각 프로그램은 자신에게 정리된 주소 공간이 있는 것처럼 동작하고, 운영체제와 하드웨어는 접근할 때 그 주소를 실제 저장 위치와 연결한다.

두 프로세스의 동일한 가상 주소가 서로 다른 물리 프레임으로 연결되고 일부 페이지는 공유되는 그림

가상 메모리는 주소 공간을 분리하면서 필요한 영역을 명시적으로 공유하게 한다.

큰 공간과 독립적인 공간

가상 메모리의 목적은 RAM 부족을 보조하는 데만 있지 않다. 주소 공간의 격리, 접근 권한, 공유, 유연한 배치도 중요한 역할이다. 같은 가상 주소를 사용하는 두 프로세스가 각각 다른 데이터를 읽을 수 있다. OSTEP의 주소 공간 장은 큰 사적 주소 공간과 효율·보호를 가상 메모리의 주요 목표로 다룬다.

흔한 구현은 주소 공간을 페이지라는 일정 크기 구간으로 나눈다. 가상 페이지와 물리 프레임의 대응은 페이지 테이블에 기록한다. CPU의 메모리 관리 장치가 주소를 변환하면서 읽기·쓰기·실행 허용 여부도 확인한다. 실제 구조는 아키텍처마다 다르지만, 프로그램이 사용하는 주소와 메모리가 제공하는 위치를 연결한다는 원리는 같다.

같은 주소가 다른 값을 읽는 예

작은 교육용 시스템에서 A와 B가 모두 가상 주소 0x2000을 읽는다고 하자. A의 변환표는 그 주소가 속한 페이지를 물리 프레임 7에 연결하고, B의 표는 프레임 19에 연결한다. 같은 주소 표현이어도 서로 다른 저장 위치에 도달한다. 반대로 공유 버퍼를 만들 때는 두 표가 같은 물리 프레임을 가리키게 할 수 있다.

가상 주소 공간이 크다고 그만큼의 RAM을 즉시 사용하는 것은 아니다. 예약만 하고 실제 접근 시점에 물리 페이지를 배정할 수 있다. 실행 파일의 코드나 파일에 연결된 메모리도 필요한 부분을 나중에 가져올 수 있다. 주소 공간의 크기, 현재 RAM에 올라온 크기, 운영체제가 보장한 할당량은 서로 다른 지표라서 따로 읽어야 한다.

없는 페이지를 만나면

접근한 페이지가 아직 RAM에 없거나 권한 처리가 필요하면 페이지 폴트가 발생할 수 있다. 운영체제는 합법적인 접근인지 확인하고 필요한 페이지를 준비한 뒤 명령을 다시 실행한다. 파일에서 읽는 경우도 있고, 0으로 채운 새 페이지를 주는 경우도 있다. 따라서 페이지 폴트가 생겼다는 사실만으로 디스크 스왑이 일어났다고 단정할 수 없다.

가상 메모리는 비용 없이 무한한 메모리를 만드는 기능이 아니다. 변환표에도 메모리가 필요하고, 주소 변환 캐시가 빗나가면 추가 작업을 한다. 활발히 쓰는 데이터가 RAM에 비해 지나치게 크면 페이지를 내보내고 다시 가져오는 일이 반복돼 성능이 크게 떨어질 수 있다. 주소 공간이 남아 있어도 물리 자원과 정책 때문에 할당이 실패할 수 있다.

이 개념은 프로그램의 메모리 사용량을 해석하고, 공유 메모리·메모리 매핑·복사 시 쓰기의 동작을 이해할 때 유용하다. 특히 메모리를 확보했다는 표현을 주소 예약, 물리 페이지 배정, 실제 데이터 접근으로 나눠 보면 지연이 발생한 지점을 훨씬 정확하게 설명할 수 있다.

참고 자료