초안 : GGWABaeGi @김민수
2024년 6월 14일 오전 12:00 (GMT+9)
가상 메모리를 얼핏 들으면 새로운 공간으로 착각하기 쉽지만, 프로그램 실행에 필요한 일부분만 램에 적재하며 나머지 메모리는 디스크에 저장해두며 필요에 따라 교체하며 사용하는 방식이다. x86 환경에서 가상메모리 주소 대역폭은 86x = 0~2^32^ -1, x64 환경에서 주소 대역폭은 0~ 2^64^-1 이다.
예전 프로그램들은 하나의 메모리 공간을 전부 할당받아 사용한다는 전제하에 만들었기에 동시성을 보장하기 어려웠다. 멀티태스킹의 필요성이 대두되며 각 프로세스마다 메모리 공간 할당에 대한 효율적인 방안이 요구되었고, 해당 결과로 가상 메모리가 등장하게 된다.
가상메모리의 역할은 다양하게 있는데, 주요 이유로는 보안 안정성, 큰 프로세스 사용 가능, 불연속적 공간을 연속적 메모리 공간사용으로 가정할 수 있다는 것이다.
서로 다른 프로세스가 같은 메모리를 공유하는 상황을 가정하면 가상 메모리의 역할을 확실히 알 수 있다. 만약 프로세스 A에 할당된 영역을 벗어나 접근하려 한다면 어떻게 될까? 널 에러를 반환하거나 심하다면 다른 프로세스의 메모리를 참조하여 오류를 불러올 것이다. 이를 가상 주소와 물리 메모리 주소를 매핑하는 과정을 거쳐 메모리 가상화를 통해 서로 배타적인 메모리 공간을 사용함으로 안정성을 확보하게 된다.
그렇다면 어떻게 가상메모리는 실제 메모리 공간보다 큰 프로세스를 실행할 수 있을까.
예를 들어 램 용량이 16인데 반해 프로세스의 총합이 20이라면 모든 메모리를 로드하여 실행할 수 없을것이다. 그렇기에 프로세스 실행에 필요한 특정 메모리 부분만 로드하여 필요시 하드 디스크와의 swap을 통해 더 많은 공간을 사용할 수 있는 것이다.
즉 추가적인 공간을 만들어주는것은 아니고, 필요할 때마다 가져와 사용하니 공간을 더 효율적으로 사용할 수 있다는 말이다.
실제 물리 메모리엔 파편화되어 있지만, 가상 메모리에선 연속적으로 취급할 수 있다.