가상 주소 공간(假想 住所 空間, 영어: Virtual Address Space, VAS)은 가상 메모리 기법을 통해 운영 체제가 각 프로세스에 제공하는 주소 공간을 의미한다. 프로세스가 참조할 수 있는 논리적 주소들의 연속된 범위로, 실제 물리 메모리(주기억장치)의 주소 공간과는 분리되어 운영 체제와 하드웨어에 의해 매핑된다.
개념
가상 주소 공간은 실행 중인 프로세스가 인식하는 메모리의 추상화된 범위이다. 각 프로세스는 자신만의 독립적인 가상 주소 공간을 가지며, 이로 인해 프로세스 간 메모리 격리(process isolation)가 가능해진다. 하나의 프로세스가 다른 프로세스의 가상 주소 공간에 접근할 수 없으므로, 메모리 보호와 시스템 안정성이 확보된다. 일반적으로 프로세스 내의 스레드들은 동일한 가상 주소 공간을 공유한다.
가상 주소 공간의 크기는 주소 버스의 크기와 운영 체제의 포인터 크기 구현에 따라 달라진다. 예를 들어 32비트 시스템에서는 2³²개의 서로 다른 주소를 식별할 수 있으므로, 주소 범위는 0부터 2³²−1까지이며 총 4GB의 가상 주소 공간이 형성된다. 64비트 시스템에서는 포인터 크기가 8바이트이므로 훨씬 더 넓은 주소 공간을 제공한다.
동작 원리
가상 주소 공간에서의 주소(가상 주소)는 운영 체제의 메모리 관리 장치(MMU)와 페이지 테이블 등의 매핑 메커니즘을 통해 물리 주소로 변환된다. 프로세스가 가상 주소를 참조하면, 운영 체제는 이를 실제 물리 메모리의 위치로 변환하여 데이터를 읽거나 쓴다. 이 과정은 프로세스에게 투명하게 이루어지며, 프로세스는 자신이 물리 메모리를 직접 사용하고 있다고 인식한다.
가상 주소 공간의 일부는 실행 파일이나 DLL과 같은 파일의 내용이 매핑될 수 있으며, 페이지 파일(page file)이 백업 저장소로 사용될 수도 있다. 프로세스가 가상 주소 공간 내의 값을 사용하거나 설정하는 유일한 방법은 운영 체제에 해당 주소를 파일의 바이트와 매핑하도록 요청하는 것이다.
운영 체제별 구현
-
32비트 Windows: 기본적으로 응용 프로그램에 4GB의 가상 주소 공간이 주어진다. 이 중 2GB(0x00000000~0x7FFFFFFF)는 사용자 모드 공간으로 각 응용 프로그램마다 독립적으로 사용 가능하며, 나머지 2GB(0x80000000~0xFFFFFFFF)는 운영 체제가 사용하는 커널 가상 주소 공간이다. boot.ini에 '/3GB' 옵션을 지정하면 개별 응용 프로그램이 최대 3GB까지 사용자 모드 가상 주소 공간을 사용할 수 있으며, 이 경우 IMAGE_FILE_LARGE_ADDRESS_AWARE 옵션이 필요하다.
-
64비트 Windows: 64비트 실행 파일의 경우 사용자 모드 가상 주소 공간이 크게 확장된다. Windows 8 이전 버전에서는 최대 8TB, Windows 8.1 이후 버전에서는 최대 128TB까지 사용할 수 있다. /LARGEADDRESSAWARE:NO 옵션으로 링크하면 인위적으로 2GB로 제한할 수 있으며, 64비트 Windows에서 32비트 프로그램을 /LARGEADDRESSAWARE:YES 옵션으로 구동하면 사용자 모드 공간을 4GB까지 사용할 수 있다.
-
Linux: x86 32비트 CPU의 경우 사용자/커널 주소 범위를 다양한 방식으로 분할할 수 있다. 기본값은 3GB/1GB(사용자/커널) 분할이며, 1GB/3GB 또는 2GB/2GB 분할도 가능하다.
의의
가상 주소 공간은 현대 운영 체제의 핵심적인 메모리 관리 개념으로, 프로세스 격리를 통한 보안 강화, 물리 메모리보다 큰 주소 공간의 활용, 메모리 보호, 그리고 효율적인 메모리 관리 등의 이점을 제공한다. 오늘날 대부분의 운영 체제에는 가상 메모리 기법이 적용되어 있으며, 가상 주소 공간은 그 기반이 되는 핵심 개념이다.