이제 아직 해결하지 못한 두 문제를 해결하고자 한다. 이 문제를 해결하면 가상 메모리에 대한 핵심을 거의 이해했다고 봐도 무방하다.
아직 해결하지 못한 문제들
1. 32비트 시스템에서 하드디스크를 이용하여 프로세스마다 가상 메모리 공간 4G바이트를 할당하는 것은 효율적이지 못하다.
2. 하드디스크는 메인 메모리와 비교했을 때 느리다.
이 두 가지 문제를 해결하기 위해서 페이지, 페이지 프레임, 페이지 테이블이 필요하다.
페이지, 페이지 프레임, 페이지 테이블
먼저 1번 문제를 해결해보자.
불필요하게 많은 공간을 하드디스크에 할당하는 것은 올바르지 못하다. 4G바이트나 되는 공간을 할당하면 낭비도 심하고 시간도 오래 걸리기 때문이다. 그래서 좀더 작은 단위로 할당하는 것은 어떤가?
위의 그림을 살펴보자. 32비트 시스템에서 표현할 수 있는 메모리 주소의 범위는 4G만큼이다. 이를 사용하여 가상 주소를 표시한다. 그림 좌측의 긴 막대가 바로 가상 주소 공간이다. 이는 논리적인 주소일뿐 물리적인 메모리 주소가 아니다. 그래서 가상 주소 공간의 크기는 4G만큼이지만 실제 메인 메모리의 크기와 차이가 발생한다. 여튼 그림에서 가상 주소 공간의 크기는 64K이다. 64K라면 16비트 시스템이라고 유추할 수 있다. 그림에서 64K의 공간을 16개로 분할하였다. 왜 분할하였겠는가? 한 번에 4G바이트씩 할당하는 것은 비효율적이기 때문이다. 그래서 4K바이트로 할당 용량을 줄여서 낭비되는 공간을 줄였다. 1번 문제점의 해결책이 바로 이 방법이다. 이렇게 4K로 나눈 가상 주고 공간의 블록을 페이지(page)라고 부른다.
이제 그림의 오른쪽 짧은 막대를 보자. 물리적인 메모리 주소라고 표시되어 있다. 이것이 메인 메모리의 실제 주소 공간이다. 메인 메모리의 주소 공간 역시 4K바이트 단위로 나눠져 있다. 가상 주소 공간과 크기를 맞추었기 때문이다. 메인 메모리의 블럭을 페이지 프레임(page frame)이라고 부른다.
그럼 가상 주소 공간과 물리 주소 공간을 맵핑(mapping)시키기만 하면 된다. 가상 주소 공간에 숫자는 물리 주소 공간의 어디에 맵핑되는지를 나타낸다. 예를 들어 0 ~ 4K 구간은 물리 주소 공간의 8 ~ 12K 구간에 맵핑되어 있다. 이렇게 맵핑을 하면 무엇이 좋은가? 이는 2번 문제점에 대한 답이 된다. 가상 주소 공간을 활용하면 물리 주소 공간에 비해서 표현할 수 있는 메모리 주소의 범위가 증가하고, 더 많은 메모리를 사용하는 효과를 얻을 수 있다. 다만 하드디스크는 느리다는 단점이 있다. 느린 하드디스크의 한계를 극복하고자 하드디스크와 맵핑된 메인 메모리를 활용한다. 이는 메모리 계층 구조와 동일한 원리이다.
가상 주소 공간과 물리 주소 공간을 맵핑한 정보는 페이지 테이블(page table)을 통해 관리된다. 위의 그림이 바로 페이지 테이블에 대한 설명이다.
만약 가상 주소 공간 전체에 페이지가 할당되어 있는 경우를 생각해보자. 메인 메모리는 가상 주소 공간의 페이지 전체를 담을 수 없다. 그럼 가상 주소 공간의 일부분만 메인 메모리에 올려서 사용할 수 밖에 없을 것이다. 그런데 필요한 데이터가 메인 메모리의 존재하지 않으면 어떻게 하나? 이는 캐쉬 알고리즘을 이해하고 있다면 쉽게 알 수 있다. 가상 주소 공간에 존재하는 즉 실제로는 하드디스크에 저장된 데이터를 메인 메모리로 올리고, 가장 불필요하다고 판단되는 데이터를 다시 하드디스크로 내리면 된다. 이 과정에 대해서 조금더 부연 설명을 하면 올리고 내리는 데이터는 스왑파일(swap file)이라는 형태로 저장된다. 내리고자 하는 데이터를 스왑파일로 저장하여 하드디스크로 저장하고, 올리고자 하는 데이터 또한 스왑파일로 저장된 상태이므로 메인 메모리로 바로 올리면 된다.
정리하면
시스템이 표현할 수 있는 주소 범위를 활용하여 가상 주소 공간으로 사용한다.
가상 주소 공간은 하드디스크를 활용하여 데이터를 저장할 수 있다.
프로세스를 실행하는데 필요한 데이터는 메인 메모리로, 불필요한 데이터는 하드디스크로 저장한다.
가상 주소 공간을 관리하는 정보는 페이지 테이블에 보관되어 있다.
가상 메모리는 메모리 계층 구조, 캐쉬의 장점을 활용한다.