삽질의 현장/- 윈도우 시스템

#031_WIndow_System_힙(Heap)

shovelman 2015. 9. 30. 20:37


안녕하세요 삽잡이입니다.


이번시간에는 가상 메모리에 대한 얘기를 이어서 해보려 합니다.


물리메모리에 두개의 Application A, B가 있다고 해보겠습니다.

실제 A 어플리케이션에서 사용할 수 있는 주소는 가상 주소 공간밖에 없습니다.

가상 주소 공간의 메모리가 실제 할당이 되면, 물리 메모리에 똑같이 할당이 되게 됩니다.

실제 메모리와 매핑되는 메모리 영역을 우리는 커밋(확장)영역이라고 부릅니다.


그리고, 실제 메모리 영역에 할당이 안되어있으며, 

얼마든지 다른 물리 메모리 영역에 할당할 수 있도록 만든 메모리

즉, '내 입장에서는 연속적인 메모리이지만, 실제 물리 메모리에서는 연속적이지 않아도 되는 영역'을

예약(리저브)영역이라고 합니다.


마지막으로 전혀 예약도 되지 않은 영역을 자유 영역이라고 하지요...


OS에서 가장 기본적인 메모리 영역을 Virtual 메모리 영역이라고 합니다.

그리고 위의 세가지 영역으로 나뉘어 지는 것이구요...


Virtaul 메모리 영역 위에는 Heap 메모리가 만들어집니다.

Heap메모리는 우리가 알고 있는 메모리 공간이 맞습니다...


Heap에는 두가지 종류가 있는데요,

기본 힙과 사용자 힙이 있습니다.


기본 힙, 사용자 힙은 둘다 모두 내부적으로 Vritual 메모리를 사용하고 있는 것입니다.


우리가 말하는 힙은 Virtual 메모리와 사용자 힙 + 기본 힙을 말함으로써,

API가 제공하는 영역을 말합니다.

그리고 우리가 동적 메모리를 할당하고 소멸했던 

new ~delete ,  malloc~free는 기본 힙을 사용하는 것입니다.


또한 new ~delete ,  malloc~free 이들은 C,C++ 런타임 라이브러리가 제공해줍니다.

즉, 컴파일러 수준에서 제공을 해주는 것입니다.


사용자의 힙을 사용할 경우,

내가 만들고 없앴다를 자유롭게 할 수 있게 됩니다. 기본 힙의 경우 이게 불가능합니다.

즉, 사용자 힙은 훨씬 효율적으로 동작한다고 볼 수 있습니다.


또한, 힙은 쓰레드들에 의해서 공유됩니다.

그렇다면 new로 할당하러 한 쓰레드가 갔는데 다른 놈이 new를 호출했을 경우

동기화 문제가 발생할 수 있게 되는 것이지요...


기본적으로 메모리가 할당하고 리턴할 때 까지 동작하는 메커니즘은

동기화 메커니즘이 기본적으로 동작합니다.

메모리 할당 함수에 대해서 기본적으로 그 함수가 완벽하고 반환할 떄 까지는 

쓰레드의 동기화가 원자적인 연산에 의해 동작하기 때문에 오버헤드가 커지겠지요...


그런데, 힙을 분리해서 사용하면 동기화를 할 필요가 없어집니다.

즉, 사용자 힙을 사용할 경우 이런 이점을 얻을 수 있다는 것입니다.


마지막으로,

사용자 힙, 기본 힙에 비해서 virtual 메모리는 예약하고 커밋할 수 있다는 장점이 있습니다.


지금까지 힙, 가상 메모리에 대해서 알아봤습니다.


이상 삽잡이였습니다!