가상 메모리는 프로그램이 사용하는 주소를 실제 물리 메모리와 분리해, 각 프로세스에 독립된 주소 공간을 제공하는 메모리 관리 방식입니다.
필요한 이유는 크게 세 가지입니다.
- 보호와 격리: 프로세스별 매핑과 접근 권한으로 다른 프로세스나 커널 메모리에 대한 임의 접근을 막습니다.
- 메모리 사용의 단순화: 프로그램이 물리 메모리의 실제 위치를 몰라도 연속적인 가상 주소 범위를 사용할 수 있습니다.
- 효율적인 물리 메모리 사용: 필요한 페이지만 올리는 요구 페이징과 페이지 공유로 메모리를 활용합니다.
일반적인 페이징 시스템에서는 MMU가 페이지 테이블과 TLB를 이용해 가상 주소를 물리 주소로 변환합니다. 디스크를 보조 저장소로 활용하면 물리 메모리보다 큰 주소 공간도 사용할 수 있지만, 가상 메모리의 핵심은 주소의 추상화와 보호입니다.
스왑 공간이 없어도 가상 메모리를 사용할 수 있나요?
가능합니다. 주소 변환과 프로세스 격리는 스왑 없이도 동작합니다. 다만 수정된 익명 페이지를 디스크로 내보내는 수단이 제한되어 메모리 부족에 더 취약할 수 있습니다.
서로 다른 프로세스가 같은 가상 주소를 사용하면 충돌하지 않나요?
프로세스마다 주소 매핑이 다르므로 같은 가상 주소가 서로 다른 물리 페이지를 가리킬 수 있습니다. 반대로 공유 메모리는 서로 다른 가상 주소를 같은 물리 페이지에 연결할 수도 있습니다.
가상 메모리가 있으면 메모리를 무한히 사용할 수 있나요?
아닙니다. 주소 공간과 물리 메모리·보조 저장소에는 한계가 있습니다. 자주 사용하는 페이지들의 집합인 Working Set이 메모리에 들어가지 않으면 Page Fault와 교체가 반복되는 Thrashing이 발생할 수 있습니다.