가상 메모리 등장한 이유, 가상 메모리 이용하는 원리
1. 가상 메모리란? 등장 배경과 개념
우리 PC는 대부분 폰 노이만 구조 기반으로, 프로그램의 코드는 무조건 메모리에 올려서 실행되어야 한다. 즉 프로세스가 실행되려면, 각 프로세스마다 충분한 메모리를 할당받아야 한다. 리눅스 프로세스는 하나에 4GB인데, 통상적인 메모리는 8GB 또는 16GB다. 멀티 프로세스로 프로그램을 실행시킨다고 가정했을 때 동시에 2개에서 4개 정도만 프로그램을 실행시킬 수 있다. 더 많은 프로세스를 동시에 실행하려면 메모리가 더 커져야 하는데 현실적으로 비용이 많이 든다는 한계가 있다. 따라서, 여러 프로세스를 돌릴 수 있는 구조가 필요해지면서 가상 메모리의 개념이 등장했다.
물리 메모리만 사용한다고 가정을 했을 때, 단순하게 생각해 보면 물리 메모리에 Process A와 Process B를 올려서 실행시킨다고 한다면 그림의 경우 둘 중 하나만 실행할 수 있다. 그러나 실제로는 전체 프로세스를 한 번에 뚝딱 처리해야 하는 건 아니다. 즉 실행하는 모든 순간에 메모리가 4GB를 무조건 차지하고 있어야 하는 것은 아니다.
현실에서는 CPU가 차지하는 메모리 공간은 제한적이기 때문에 한방에 4GB를 몽땅 쓰지 않고, 한 줄 한 줄 코드를 읽다가 필요할 때만 특정 시간 동안 특정 메모리 주소를 참조한다. 예를 들어 예외적인 오류 조건을 처리하는 코드는 자주 필요한 것이 아니고, 배열, 리스트, 테이블 등의 크기는 실제 크기보다 정의된 크기가 항상 클 수 있고, 또 자주 사용되지 않는 프로그램의 기능은 사용될 때만 메모리에 적재하면 된다.
CPU가 한 프로세스의 특정 공간을 참조할 때, 그 공간에 해당하는 물리 메모리가 어느 주소인지만 알면, 그 주소 공간을 안 쓸 때 메모리를 해제해 주고, 그렇게 해제된 공간을 다른 프로세스가 차지하고 쓰다가 다 쓰면 해제하고를 반복하면 된다. 프로세스가 사용하는 가상 메모리 주소는 0GB~4GB 주소고, 그중에 일부만 물리 메모리를 실제로 사용한다. 이렇게 실제 한정된 메모리 용량을 효율적으로 사용할 수 있도록 하는 기술을 가상 메모리 기술이라고 한다.
2. 가상 메모리와 MMU
CPU가 프로세스를 실행할 때는 가상 메모리 주소를 사용하고, 실제 해당 가상 주소에서 데이터를 읽고 쓸 때만 물리 메모리 주소로 접근해서 실행한다. 즉 두 가지의 주소가 필요하다.
virtual address(가상 주소): 프로세스가 참조하는 주소 (0~4GB)
physical address(물리 주소): 실제 메모리 주소 (0~4GB 중 일부만)
원리는 다음과 같다. CPU는 가상 주소를 먼저 찾고, 물리 메모리 주소가 필요한 경우 어느 물리 주소인지 찾아내어 프로세스를 실행한다. 그런데 여기에서 가상 주소와 물리 주소를 변환하는 과정이 필요하다. 이 역할을 해 주는 것이 바로 MMU(Memory Management Unit)이다. MMU는 하드웨어 칩으로, 가상 주소에서 물리 주소로 빠르게 변환하는 기능을 제공한다. 주소 변환에 하드웨어 지원이 필요한 만큼 빠른 변환이 필요한 과정이다.
CPU는 무조건 가상 메모리만을 참조하고, MMU는 어느 가상 주소가 어느 물리 주소에 매칭이 되는지 확인한다. 그렇게 매칭 되는 물리 주소로 물리 메모리에 접근하여, 해당 data를 CPU에 전달한다.