HeapAlloc , LocalAlloc, GlobalAlloc

기능 : 힙에서 메모리 블록을 할당.

LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);

[LocalAlloc 과 HeapAlloc]
- Win16 환경
  16비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 다른다.
  LocalAlloc는 near pointer를 반환하고 GlobalAlloc는 far pointer를 반환한다.
  GlobalAlloc은 전역, 즉 윈도우가 사용하는 Global Heap영역을 사용하고,
  LoaclAlloc은 Local Heap을 사용한다.

- Win32 환경
  32비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 동일하다.
  기능은 완전히 동일하나 하위 호환성을 위해 각각의 함수가 존재한다.

[HeapAlloc과 LocalAlloc/GlobalAlloc 의 차이점]
- 메모리 블록을 할당하는 힙이 다르다. 
   * LocalAlloc은 항상 디폴트 힙(어플리케이션이 하나씩 가지는 메인 힙)에서 할당한다.
     디폴트 힙은 프로세스가 생성되고 가상 주소 공간이 생겨날 때 같이 생성되는 힙이다.
     그 크기는 링크시 실행파일 헤더에 기록이 된다. 링크 옵션으로 그 크기를 변경할 수도 있다. 기본 값은 1MB이다. 
 
   * HeapAlloc은 임의의 힙에서 할당한다. 
     HeapCreate로 만든 힙일 수도 있고 GetProcessHeap으로 얻는 디폴트 힙일 수도 있다.

- HeapAlloc은 포인터를 리턴하지만 LocalAlloc은 핸들을 리턴한다.
   * LocalAlloc으로 할당받은 메모리 블록을 실제로 사용할 때는 LocalLock 함수로 포인터를 얻어와야 한다.
     LocalAlloc의 사용이 좀 더 불편하지만 핸들을 사용하므로써 동기화와 같은 기능을 제공한다.
     그리고 포인터를 직접 사용하지 않고 포인터를 사용하는 또 다른 (결과적으로) 이유는 다음과 같다.
     LocalAlloc의 첫번째 인자는 할당받을 메모리 블록의 특성을 지정하는데, GMEM_MOVEABLE 이라는 특성을 지정할 수 있다.    
     이는 힙 메모리 단편화 제거를 위해 또는 힙 공간이 부족할 때 힙 관리자가 메모리 블록을 이동할 수 있도록 하게 하는데
     이렇게 되면 포인터로 리턴했을 경우 이동된 후 잘못된 참조를 하게 되므로 핸들로서 관리되는 것이다.
     실제로 GMEM_MOVEABLE 이 아닌 GMEM_FIXED로 지정하게 되면 리턴값은 그 자체가 포인터이다.

[VirtualAlloc과 GlobalAlloc, LocalAlloc의 차이점]
- VirutalAlloc은 64bit 메모리 주소를 리턴한다.
- GlobalAlloc, LocalAlloc은 32bit 메모리 주소를 리턴한다.
- VirtualAlloc은 메모리를 설정한것을 다른 곳에서 공유할 수 있으나, Global, Locak에서는 한 곳에서만 독점하여 사용한다.

[Virtual Memory 사용 방법]
- VirtualAlloc(페이지를 생성한다.) -> VirtualLock(페이지를 예약한다.) -> 데이터를 페이지에 기록한다. -> 데이터를 사용한다. -> VirtualUnLock(페이지 예약을 취소한다.) -> VirtualFree(페이지를 삭제한다.) 

by stein | 2008/03/06 13:49 | Windows Programing | 트랙백 | 덧글(1)

트랙백 주소 : http://dstein.egloos.com/tb/1783730
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by Kimjungsoo at 2009/04/20 10:40
좋은 정보 감사 합니다.

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶