티스토리 툴바


Programming tips2008/11/09 14:02
Windows 프로그래밍을 하다보면, (요새는, WINCE 쪽에서 자주 하다 보니...) memory allcoation 을 할 때 일반적으로 malloc 을 많이 쓴다.

malloc 이야 워낙 대중적(?) 인 allocation 함수인데, system programming 을 하다 보면 좀 더 효율적인 할당을 위해 HeapAlloc 이라는 것을 사용한다. HeapAlloc 이란 말 그대로 Heap 에서 allocation 을 받는 것인데, 이 때에 아무런 Heap 영역에서 받는 것이 아니다.

HeapCreate 라는 함수를 통해서, 현재 사용할 Heap 영역을 규정한다. 이 때에 Heap handle 값을 받게 되는데 이 handle 값을 이용해 HeapAlloc 이란 함수를 이용하면, 자신이 규정한 (private heap) 영역에서 memory 를 할당 받게 되고 다른 영역으로 자신의 memory 공간을 보호하고 확보할 수 있게 된다. 

dynamic allocation 방법 중에서 이 HeapAlloc 이 가장 빠르다고 한다. HeapCreate 로 생성한 영역은 나중에 현재 dll 이면 dll unload 시나, 혹은 exe 라면 프로그램 종료시에 HeapDestory 를 통해 reserved area 을 해제시켜야 한다. HeapAlloc 을 통해 확보한 영역은 사용한 후 HeapFree 를 통해 해제한다. 즉, 간단하게 표현하면

HeapCreate [Heap Area 확보] --> HeapAlloc & HeapFree [use memory] --> HeapDestory [Heap Area 반환]

이런 식으로 동작하게 된다. 

그런데, 일반적으로 application 을 구현하다 보면, LocalAlloc 이란 memory 할당 함수를 사용할 때도 있다. 이 함수는 HeapAlloc과 뭐가 다를까? 
LocalAlloc 을 쉽게 말해서 HeapAlloc의 wrapper 함수라고 생각하면 된다. HeapAlloc 의 경우 HeapCreate 를 통하지 않고 현재의 process 의 handle 을 얻어서 그 값을 가지고 memory 할당을 받을 수 있다. 즉, process의 global heap 영역에서 할당 받는 방식이 있다.
LocalAlloc 을 호출하게 되면 궁극적으로 HeapAlloc 을 호출하게 되는데, 이 때에 private heap 에서 할당받는 것이 아니라 global heap 에서 할당받게 된다. 그리고 LocalAlloc 의 경우 할당 받은 메모리를 handle 로 관리하게 되므로 (HeapAlloc 은 list 로...) 이에 대한 handle 값을 return 하게 된다.

즉, 간단하게 말해서 LocalAlloc 은 HeapAlloc 의 wrapper function 인데, process 영역의 global heap 에서 할당을 받게 되고, 할당 받은 영역을 handle 로서 관리를 해줘야 한다. 즉, 직접적으로 HeapAlloc 을 쓰는 것에 비해 overhead 가 있다. 

빈번히 사용하는 동적 메모리 할당을 이용하고, 이에 대한 성능 개선이 필요하다면 HeapAlloc 을 이용하는 것이 훨씬 도움이 된다는 것을 알 수 있다. malloc 도 결국 HeapAlloc을 호출한다... HeapAlloc 을 잘 쓰면 많음 도움이 된다!


Posted by SHL SHL