티스토리 뷰

책 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍

 

우리가 흔히 말하는 Heap이란, malloc, new 등을 통해서 동적으로 생성할 수 있는 메모리 공간을 뜻합니다. 보통 malloc 등을 통해서 선언된 동적 배열 공간은, 멀티쓰레드 환경에서 쓰레드들 간의 공유하는 상황이 발생하게 됩니다.  그러다보니, 다른 쓰레드가 그 공간을 건들여서 해제를 하거나 하는 상황이 발생할 수 있습니다. 그래서 Windows에서는 쓰레드 별로 사용할 힙을 별도로 할당해줄 수 있습니다. 이것을 Dynamic Heap이라고 합니다.

 

다이나믹 힙같은 경우에는 해제할 경우 힙에 있는 모든 데이터가 해제되므로 링크드 리스트 같은 자료구조 형에서도 유용합니다.

 

- 디폴트 힙(Default Heap) : 공유하고 있는 기본적인 힙

- 힙(Dynamic Heap) : 쓰레드 별로 정해 놓은 힙 영역 - 모든 페이지들의 상태가 Reverse이며, 몇몇 페이지는 Commit 상태일 수 있음.

장점 : 1) 메모리 단편화의 최소화에 따른 성능 향상

          2) 동기화 문제에서 자유로워짐으로 인한 성능향상.

 

- 힙 생성 및 삭제

HANDLE HeapCreate(
    DWORD flOptions,      // 힙의 특성 - HEAP_NO_SERIALIZE(동기화 처리 X 장점 2)   
    SIZE_T dwInitialSize, // 초기에 할당할 메모리 크기를 지정, 페이지 수만큼 COMMIT 상태
    SiZE_T dwMaximumSize  // 힙의 크기를 결정함
};

BOOL HeapDestroy(
    HANDLE hHeap;
);

 

- 힙 할당 및 해제

LPVOID HeapAlloc(
    HANDLE hHeap,   // 핸들 지정
    DWORD dwFlags,  // HEAP_GENERATE_EXCEPTIONS(오류 발생시 NULL 반환 X, 예외 발생)
                    // HEAP_ZERO_MEMORY(0으로 초기화)
    SIZE_T dwBytes  // 할당할 메모리의 크기 지정
);

BOOL HeapFree(
    HANDLE hHeap,   // 핸들 지정
    DWORD dwFlags,  // 플래그
    LPVOID lpMem    // 해제할 메모리의 시작 주소    
);

 

기본예제

더보기
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> 
#include <tchar.h>

int main(int argc, TCHAR* argv[])
{
	SYSTEM_INFO sysInfo;
	GetSystemInfo(&sysInfo);
	UINT pageSize = sysInfo.dwPageSize;

	// 1. 힙의 생성.
	HANDLE hHeap = HeapCreate(HEAP_NO_SERIALIZE, pageSize * 10, pageSize * 100);
	if (hHeap == NULL)
		return 0;
	// 2. 메모리 할당.
	int* p = (int*)HeapAlloc(hHeap, 0, sizeof(int) * 10);

	// 3. 메모리 활용.
	for (int i = 0; i < 10; i++) {
		p[i] = i;
		_tprintf(_T("%d\n"), p[i]);
	}

	// 4. 메모리 해제 
	HeapFree(hHeap, 0, p);

	// 5. 힙 소멸.
	HeapDestroy(hHeap);

	HANDLE hDefaultHeap = GetProcessHeap();
	TCHAR* pDefault = (TCHAR*)HeapAlloc(hDefaultHeap, HEAP_NO_SERIALIZE, sizeof(TCHAR) * 20);
	_tcscpy(pDefault, _T("Default Heap!"));
	_tprintf(_T("%s \n"), pDefault);
	HeapFree(hDefaultHeap, HEAP_NO_SERIALIZE, pDefault);

	return 1;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함