제공 : 한빛 네트워크
출처 : IT EXPERT, 리눅스 커널 프로그래밍 Chapter 8
가상 메모리에 대해 이야기를 하면 꼭 듣게 되는 이야기가 32비트 환경에서는 프로세스 하나당 4GB의 메모리 공간을 갖는다는 것입니다. 즉, 스타크래프트도 4GB의 메모리 공간을 사용한다고 생각하고, 인터넷 브라우저도 4GB의 메모리 공간을 사용한다고 생각합니다. ‘잠깐만요! 저는 PC에 램이 512M밖에 없는데요?’라고 생각할 수 있습니다.
프로세스가 4GB의 주소 공간을 사용할 수 있다고 해서, 한 번에 4GB의 공간을 모두 사용하는 것은 아닙니다. 실제로는 프로그램을 실행하는 데 필요한 공간만 사용하기 때문에, 실제 사용하는 부분만 메모리에 있으면 됩니다. 물론, 프로그램을 실행하는 데 필요한 공간이 꼭 메모리에 있을 필요는 없습니다. 프로그램 실행에 필요한 모든 공간이 모두 하드디스크에 있어도 프로그램은 실행될 수 있습니다. 다만, 메모리에 비해 속도가 느린 하드디스크에서 실행되기 때문에 그만큼 프로그램이 늦게 반응하며, 천천히 실행될 뿐입니다. 실제로, 램이 4M인 PC에 윈도우 95를 설치하고, 메모리 요구량이 8M인 게임을 실행할 수 있었습니다. 가상 메모리와 부족한 메모리를 하드디스크를 이용해서 보충해주는 스왑(Swap) 덕분에 이런 일이 가능했지만, 이렇게 실행되는 게임은 매우 느리게 동작했습니다.
각 프로세스는 4G의 공간을 모두 자기 것이라 생각하며, 운영체제는 프로세스가 실제로 사용하는 부분만큼 실제 메모리에 할당하면 됩니다. 운영체제는 프로세스의 가상 주소와 물리 메모리의 관계를 유지하기 위해 변환 테이블을 사용합니다.
[그림 8-1] 프로세스 A의 가상 공간과 실제 메모리
가상 메모리에 대해서는 페이지, 물리 메모리에 대해서는 프레임으로 사용합니다. PFN은 페이지 프레임 번호(Page Frame Number)를 의미하며, 리눅스 커널에 대한 다른 문서들에서는 프레임이라는 표현보다는 PFN이라는 표현을 자주 접하게 될 것입니다.
먼저, 그림에서 볼 수 있는 것처럼 프로세스 A는 가상 메모리 상에서 페이지 1, 4, 7번을 사용하고 있습니다. 이들 각각은 프로세스 A의 페이지 테이블을 참고해서 물리 메모리 상의 위치를 참고하게 됩니다. 예를 들어, 페이지 1번은 5번 프레임에 저장되며, 페이지 4번은 3번 프레임에 저장되는 것을 알 수 있습니다. 다음 그림은 프로세스 A와 프로세스 B가 있는 경우의 가상 메모리 매핑을 나타낸 것입니다. 프로세스 A와 마찬가지로 프로세스 B도 자신만의 4G의 가상 공간을 가지며, 프로세스 B의 변환 테이블을 사용해서 물리 메모리로 연결됩니다. 한 가지 특이한 점은 그림을 보면 프로세스 A의 1번 페이지는 물리 메모리의 5번 프레임을 사용하고 있고, 프로세스 B의 7번 페이지도 물리 메모리의 5번 프레임을 사용하고 있다는 점입니다. 윈도우의 DLL이나 리눅스의 so(공유 객체, Shared Object) 파일들은 여러 프로세스가 동시에 사용하게 되는 데, 이 때마다 복사본을 메모리에 로드하는 대신에 같은 물리 메모리를 가리키게 하는 것으로 중복에 따른 메모리 낭비를 막을 수 있습니다.
[그림 8-2] 가상 메모리와 물리 메모리의 관계
각 프로세스는 주소 변환 테이블을 갖고 있으며, 이에 따라 물리 메모리로 연결되기 때문에 다른 프로그램이 사용하는 메모리 공간에 대해 염려하지 않고 프로그램을 작성할 수 있습니다. 여기까지는 메모리를 관리하는 방법을 이론적으로 나눈 것이며, CPU에서 메모리를 관리하는 방법은 다릅니다. 즉, OS에서 메모리를 관리하는 방법은 OS를 제작하는 사람이 마음대로 정할 수 있는 것이지만 실제로 CPU와 데이터를 주고받을 때는 CPU에 맞춰서 데이터를 주고받아야 합니다. 우리가 사용하는 x86 CPU는 리얼 모드(Real Mode)와 보호 모드(Protected Mode)를 사용합니다. 리얼 모드는 예전에 도스(DOS)를 사용하던 시절에 사용하던 모드로 1M까지의 메모리를 사용할 수 있습니다. 보호 모드에서는 메모리를 0~4G까지 사용할 수 있습니다. 요즘에는 모두들 512M 이상의 램을 장착해서 사용하는 것이 보편적이니 리얼 모드는 몰라도 되지 않나라고 생각할 것입니다. 그러나 시스템이 처음 전원이 들어가고, 부팅이 될 때는 리얼 모드로 실행되고, 그 이후에 보호 모드로 넘어가게 됩니다. 그렇기 때문에 커널을 학습하는 사람들은 CPU에서 메모리를 관리하는 방법이 리얼 모드일 때와 보호 모드일 때 다르다는 것을 알아야 합니다. 이에 대해서는 뒤에서 보다 자세히 설명하도록 하겠습니다.