참조

[참조 요약]
LocalAlloc(), GlobalAlloc()
: win16의 잔재. HeapAlloc 보다 느리고 적은 기능.
HeapAlloc()
: 10kb 까진 VirtualAlloc() 보다 빠르며 malloc, new의 segmentation 회피 가능.
VirtualAlloc()
: 가상 메모리 할당받아 페이지 단위로 메모리 조작.
 대용량의 공간 필요시 사용



VirtualAlloc
메모리에 대한 예약 상태 및 액세스 권한 지정이 가능. 
malloc이나 realloc의 메모리 단편화를 극복할 수 있으며 대용량의 메모리가 필요한 경우 유용하다.
보통 시스템 페이지 사이즈(보통 4KB) 단위로 할당된다.

[Overview]
VirtualAlloc() : 가상 메모리 할당
VirtualFree() : 가상 메모리 할당 해제
VirtualProtect(): 접근 권한 변경
VirtualQuery() : 지정한 주소의 페이지 정보 얻기
VirtualLock() : 특정 주소에 특정 길이만큼 메모리 페이지를 잠그며 
잠긴 영역의 데이터는 페이징 파일로 보내지 않고 항상 RAM에 남아있게 된다.
VirtualUnlock() : 데이터가 페이징 파일로 이동할 수 있도록 잠금을 해제한다.

[VirtualAlloc()]
예약(MEM_RESERVE), 확정(MEM_COMMIT) 할당방법 제공. (예약은 64KM 블록 단위로 처리됨)
MEM_RESERVE : 물리적 메모리 확정 없이 주소 공간만 예약
MEM_COMMIT : 물리적 메모리 확정 (실제 사용을 위해 필요)
MEM_TOPDOWN : 가급적 높은 번지의 메모리 할당(NT 이상)
MEM_FREE : 사용할 수 있는 자유 영역
예약과 확정을 동시에 요청할 경우 MEM_RESERVE | MEM_COMMIT 사용
할당 번지(1번쨰 인자)는 할당 단위의 배수가 되는 번지로 내림하여 할당.
NULL시 알아서 적당한 번지를 돌려줌
할당 영역(2번째 인자)은 페이지 단위의 배수 (대부분의 페이지 크기는 4K)
[VirtualFree()]
MEM_DECOMMIT: 확정(MEM_COMMIT) 해제
MEM_RELEASE : 예약(MEM_RESERVE) 해제
[메모리 보호 속성(Memory Protection Constants)]
PAGE_EXECUTE : 실행 가능 (read, write 불가)
PAGE_EXECUTE_READ : 실행, 읽기 가능
PAGE_EXECUTE_READWRITE : 실행, 읽기, 쓰기 가능
PAGE_NOACCESS : 읽기, 쓰기, 실행 금지 (모든 액세스 금지)
PAGE_NOCACHE : 캐시 금지. (시스템 SW에서 사용)
PAGE_READONLY : 읽기 가능
PAGE_READWRITE : 읽기, 쓰기 가능
PAGE_GUARD : 보호 페이지 지정(주로 메모리 끝을 표시하는 용도). 
 이 페이지에 읽기, 쓰기 시도시 STATUS_GUARD_PAGE 예외 발생 후 보호 페이지 상태 해제
PAGE_EXECUTE_WRITECOPY : 공유 영역에 쓰기시 사본을 작성함.
PAGE_WRITECOPY
PAGE_WRITECOMBINE :
**. 실행은 해당 메모리의 코드를 CPU가 실행할 수 있다는 뜻으로 아직까진 읽기와 같은 뜻으로 쓰인다.

[샘플]


HeapAlloc
가상 메모리 공간의 예약된 영역 사용
작은 메모리 블록을 할당하여 사용할때 VirtualAlloc보다 유리하다.
ex) 4byte 크기로 10000번 메모리 할당할 경우
VirtualAlloc은 40MB 가상메모리와 660MB 주소공간을 사용
(한번에 할당시 4KB(페이지 사이즈) + 주소공간 64KB)
HeapAlloc은 40KB만 사용하게 된다.
**.Default Heap : 프로세스 생성시 OS가 기본적으로 할당하는 1MB의 힙

[Overview]
GetProcessHeap() : Default Heap의 핸들을 반환한다.
HeapCreate() : Heap 생성
HeapAlloc() : Heap 에 메모리 할당
HeapFree() : Heap 의 메모리 해제
HeapDestroy() : Heap 해제 (HeapFree로 일일이 해제할 필요 없음)
HeapLock() : 현재 스레드가 Heap에 대한 독점적인 소유를 얻음
HeapUnlock() : 다른 스레드가 사용할 수 있도록 락 해제
HeapReAlloc() : Heap 크기 재할당
HeapSize() : Heap 크기를 구함
HeapCompact() : Heap 영역에 대한 조각모음
HeapValidate() : 유효한 블록인지 검사
HeapWalk() : Heap의 모든 블록 열거(잘못된 블록을 탐색하거나 디버깅시 유용)
**.Heap 할당 방식 지정 flag (보통 0으로 어떤 옵션도 사용하지 않음)
HEAP_GENERATE_EXCEPTIONS : 에러 발생시 NULL 리턴 대신 예회 발생
HEAP_NO_SERIALIZE : Heap사용에 대해 스레드 동기화를 하지 않음
(단일 스레드일때 빠른 속도를 위해 사용할 수 있지만 안정성을 위해 사용은 비권장 됨)
HEAP_ZERO_MEMORY : 할당한 HEAP을 0값으로 초기화

ex)
//옵션은 0, 4096 byte만큼 초기화 하며 1MB(1048576)까지 사용 가능
//1048576대신 0이면 무제한을 의미한다.
HANDLE TestHeap = HeapCreate(0, 4096, 1048576); 
int* ptr = (int*)HeapAlloc(TestHeap, 0, sizeof(int)*10); //40 byte 할당
for (int i=0; i<10; i++) ptr[i] = i*2;
HeapFree(TestHeap, 0, ptr); //메모리 해제
HeapDestroy(TestHeap);



GlobalAlloc/LocalAlloc
Win16에서 사용되던 함수로 Win32는 전역힙, 지역힙의 구분이 없기 때문에 동일하게 동작한다.
보통 GlobalAlloc이 사용된다.
GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree, GlobalReAlloc 함수들이 있다.
[GlobalAlloc() 의 flag 인자]
GMEM_FIXED : 메모리 할당 후 리턴된 포인터를 바로 캐스팅해 사용 가능
GMEM_MOVEABLE: OS가 효율적인 메모리 관리를 위해 메모리 이동을 허가해주며 포인터대신
  메모리 핸들을 리턴.
GMEM_ZEROINIT: 할당된 메모리를 0으로 초기화
GPTR : GMEM_FIXED | GMEM_ZEROINIT
GHND : GMEM_MOVEABLEL | GMEM_ZEROINIT
**.GMEM_MOVEABLE 사용시 GlobalLock을 통해 메모리 이동을 정지시키고 포인터로의 조작이 가능
포인터로 작업이 끝나면 GlobalUnlock으로 다시 OS가 효율적인 관리를 위한 메모리 이동을 허가해준다.

ex) GMEM_MOVEABLE 형식의 사용
hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(int)*10);
ptr = (int*)GlobalLock(hMem);
for (int i=0; i<10; i++) ptr[i] = i*2;
GlobalUnlock(hMem);
GlobalFree(hMem);

ex) GMEM_FIXED 형식의 사용
ptr = (int*)GlobalAlloc(GMEM_FIXED, sizeof(int)*10);
for (int i=0; i<10; i++) ptr[i] = i*2;
GlobalFree(hMem);





'C++' 카테고리의 다른 글

VC++ ADODB SP 호출  (0) 2011.03.30
warning LNK4099: 'vc90.pdb'  (0) 2011.03.25
CRT 이야기 [펌]  (0) 2011.02.14
IPC (inter-process communication)  (0) 2011.02.03
파일 핸들링 API  (0) 2011.02.03
MFC tip  (0) 2011.01.25
OLEDB  (0) 2011.01.24
COM  (0) 2011.01.24