Share via


On-demand 메모리 관리

오늘은 Windows 운영체제의 메모리 관리 방법에 대한 일반적인 얘기를 조금 나눠볼까 합니다.

이미 많은 분들이 아시다시피 x86 기반의 Windows에서는 각 프로세스별로 4GB의 virtual memory를 사용할 수 있도록 할당을 받습니다. 이 중에서 낮은 2GB의 주소(0x000000~0x7FFFFFFF)에 해당하는 공간이 User Mode 영역이고, 높은 2GB의 주소(0x80000000~0xFFFFFFFF)의 공간은 Kernel 영역에서 사용하게 됩니다. User Mode 영역의 경우 각 프로세스별로 독립적인 공간으로 다른 프로세스와는 전혀 다른 공간을 이용하게 되고, Kernel Mode 영역에 해당하는 2GB의 공간은 프로세스의 구분 없이 공유해서 사용되는 공간입니다.

지금은 하드웨어 기술이 발달해서 실제 개인용 PC에서도 물리적인 메모리를 수 GB 이상 갖춘 컴퓨터를 주변에서 흔히 볼 수 있지만, 이러한 virtual memory 개념이 처음 적용되는 당시만해도 128MB 정도의 메모리를 갖춘 컴퓨터도 흔치 않았던 시절입니다. 논리적으로는 프로세스별로 4GB의 메모리 공간을 사용할 수 있도록 허용하고 있지만, 실제로 이 정도의 공간을 필요로하는 응용 프로그램은 특수한 목적의 프로그램이 아닌 이상 거의 보기가 힘들다고 볼 수 있습니다.

Windows 운영체제는 응용 프로그램 뿐만 아니라 운영체제 자신에게도 메모리 사용에 있어서는 절약정신이 매우 투철한데 이를 간단히 'On-demand'로 관리한다라고 표현할 수 있습니다. 즉, '진짜 필요로 할 때에만 물리적인 메모리를 할당해준다'라고 표현할 수 있겠습니다.

우선 물리적 메모리는 x86 장비의 경우 4Kb 크기를 가지는 페이지(page) 단위로 잘게 나누어져 있는데 이를 응용 프로그램에서 사용하기 위해서는 먼저 VirtualAlloc이나 VirtualAllocEx 라는 API를 이용해서 사용하고자 하는 메모리 양을 운영체제에 알리도록 되어 있습니다. 이때 reserve와 commit이라는 2 단계로 구분해서 진행하게 되는데, reserved memory는 해당 프로세스 내의 쓰레드에 의해서 나중에 이 정도의 공간이 사용될 것이므로 '예약'만 해두는 것을 의미합니다. '예약'된 메모리는 아직 사용될 수는 없으며 실제 사용하려면 reserved 된 영역에 대해서 다시 'commit'을 해야 실제로 해당 프로세스에서 사용할 메모리 영역을 할당받고 사용 할 수 있게 됩니다.

이러한 과정은 마치 비행기의 자리를 예약하는 것에 비유할 수 있을 것입니다. 일반적으로 항공사는 특정 항공편에 대해서 120% 정도로 over booking을 받습니다. 이는 실제로 비행기표를 예약했다가 실제로 이륙하기 전에 예약을 취소하거나 탑승하지 못하는 고객이 있기 때문에 이를 대비해서 미리 예약을 실제 좌석수보다 넘게 받은 다음에, 실제로 탑승 수속(check in)을 하는 시점에 실제 좌석을 할당함으로써 빈 좌석으로 운항되는 것을 최대한 방지하려고 합니다. 비행기 표를 예약(reserve)하는 것과 탑승 수속시(commit)에 실제 좌석을 할당 받는 과정을 이러한 개념으로 이해하시면 조금 도움이 되실 것 같습니다.

그런데 운영체제 내부적으로 조금 더 깊게 들어가보면 commit 한 시점에서도 실제로 해당 프로세스에 물리적인 메모리 공간을 할당해주는 것은 아닙니다. 실제로 메모리에 접근할 수 있게 해주는 것은 그것보다도 더 이후로 미뤄둠으로써 메모리가 낭비되는 것을 한번 더 관리하게 되는데, 이는 commit 된 메모리에 실제로 해당 응용 프로그램에서 접근(access)하려는 시점에서야 물리적인 메모리의 특정 페이지를 사용할 수 있도록 허락해 줍니다.

mamory manager에서 물리적 메모리의 page는 프로세스의 가상 주소와 서로 맵핑 시켜주기 위해서 PTE(Page Table Entry)라는 구조체를 사용하는데, 실제로 이러한 PTE가 생성되어서 물리적 메모리가 mapping 되는 것은 최초로 commit된 영역에 대해서 접근하려는 순간에 이뤄집니다. 내부적으로는 commit된 page를 접근하려는 데 아직 PTE가 생성되지 않은 단계이므로 page fault가 발생하게 됩니다. 이 page fault에 대해서 운영체제는 '아.. 이제 진짜 메모리를 쓰려고 하는구나. 이젠 메모리를 사용할 수 있게 해줘야 겠군. 그럼 이 page를 사용해라'라고 PTE를 만들고 물리적 메모리를 맵핑시켜 줍니다.

물리적인 메모리의 사용을 가능한 뒤로 연기해 둠으로써 시스템의 메모리 자원을 절약하고자 하는 컨셉. 이것이 windows의 on-demand 메모리 관리 컨셉입니다.

Comments