2010. 4. 2. 16:39

메모리 레이아웃과 릭(Leak)


  프로그램이 실행되면 로더에 의해 메모리에 적재되는데, 이때 프로그램이 적재되는 공간이 바로 프로세스 영역(VMM 관리자에 의해서 물리 메모리의 일부와 하드 디스크의 메모리 맵 파일 혹은 페이지 파일을 포함하는 개념의 가상 메모리로 맵핑)입니다. 프로세스 영역에 적재된 어플리케이션을 관리하기 위해서 커널은 해당 어플리케이션의 프로세스를 생성시켜 주게되고 프로세스의 커널 오브젝트에 의해 해당 프로세스는 관리되게 됩니다.

  프로세스 영역의 크기는 1.99GB(2000을 기준함. 운영체제마다 LIMIT는 다름)로 스택, 코드, 힙 영역 등이 프로세스 영역내에서 할당됩니다. 그리고 가상 메모리 공간이나 힙 메모리 할당도 모두 프로세스 영역에서 이루어집니다. 프로세스가 종료되면 커널은 프로세스 영역을 파괴하고 반환(프로세스 오브젝트 파괴)하죠. 그렇다면 당연히 프로세스 영역내에 존재하는 스택, 코드, 힙 영역 등은 모두 마찬가지로 파괴됩니다. 이것은 유저 프로그램에서 커널이 관리하고 있는 커널 레벨의 메모리 영역에 대한 누수는 있을 수가 없음을 의미합니다. 물론, 커널 레벨에서 작동하는 디바이스 드라이버라면 얘기가 달라집니다. 메모리 레이아웃을 제대로 이해하기 위해서는 x86의 어드레싱, 가상메모리, 페이징 메커니즘을 이해하고 있어야 합니다. DRAM CHIP 자체는 정적인 한계를 가집니다. 메모리 레이아웃은 스택, 힙, 데이터 영역뿐만 아니라, 이외에도 NULL값 할당 영역, Off Limit 영역, 커널 영역과 같은 메모리 영역들이 존재(메모리 레이아웃은 벤더에 의존적인 부분이기 때문에 운영체제마다 다름)하고 있으며 일반적으로 프로그래머가 알고 있는 스택과 힙, 데이터 영역은 프로세스 영역의 아주 작은 공간으로 사용되고 있겠지요. 하하. 그리고 제가 위에서 언급하였던 모든 메모리 영역은 "4GB의 가상 메모리 영역"에 맵핑되어 있습니다. 우리 사용자가 말하는 기본적인 동적 메모리 할당의 위치는 "프로세스 영역내의 힙 영역에 대한 메모리 할당"입니다. 힙 영역에 할당한다는 의미는 프로세스 영역내에 존재하는 임의의 가상 메모리 일부분을 커널은 관리할 수 있도록 힙 오브젝트를 생성시켜 주게 되는 것을 의미하 여기서 힙 오브젝트는 할당된 메모리 영역에 대한 부가적인 정보를 가지게 됩니다. 예를 들어, 할당된 영역의 크기와 주소 위치 또 할당된 영역이 가지고 있는 데이터를 의미하는데 중요한 것은 할당된 메모리에 대한 안전성의 확보라는 것입니다. 그러니까 설사 또다른 메모리 할당 명령이 내려지더라도 이미 힙 오브젝트에 의해서 관리하고 있는 메모리 영역은 침범할 수가 없다는 의미입니다. (결국엔 "할당되지 않은 영역"도 사용은 가능하겠죠. 하지만 커널이 생성한 힙 오브젝트에 의해 관리되어지는 대상이 아니기 때문에 쓰기(write)할 때에는 이미 할당된 다른 메모리에 접근하여 Access Violation을 일으킬 수 있는 가능성을 가지고 있으며, 또한 다른 메모리 사용으로 그 영역이 침범당할 우려가 있습니다.)

  다시 한번 정리해서 유저 프로그램단에서 설명을 드리자면, new와 같은 키워드로 할당한 메모리 공간은 실행된 프로세스 영역 내의 힙 영역입니다. 우리가 사용하는 물리적인 메모리의 커널 영역을 의미하지는 않습니다. 힙 영역에 해제를 해주지 않고 계속해서 할당하게 되면 Heap Overflow가 발생하게 되는데 즉, 이것이 메모리의 릭(Leak)이죠. 하지만 어디까지나 그것은 프로세스가 실행중에 해당 로세스 영역을 계속 사용할 때를 의미합니다. 유저 프로그램이 종료될 때는 운영체제의 메모리 관리자에 의해서 모두 해제가 됩니다. 실시간 실행되어야하는 감시 어플리케이션이라든지 서버와 같은 프로그램을 개발할 때, 특히 메모리 릭을 주의해야겠죠.

Wrttien By Sim-Hyeon, Choe