티스토리 뷰
책 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍
우리가 흔히 말하는 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;
}
'서버 공부 > 시스템 프로그래밍' 카테고리의 다른 글
리눅스 파이프 통신과 좀비 프로세스 잡기 (0) | 2022.10.12 |
---|---|
쓰레드 동기화 기법 - NamedMutex와 WAIT_ABANDONED (0) | 2022.07.29 |
쓰레드 동기화 기법 - 커널 모드 동기화 (0) | 2022.07.28 |
쓰레드 동기화 기법 - 유저 모드 동기화 (0) | 2022.07.28 |
쓰레드 구현 모델 (0) | 2022.07.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스레드풀
- 링크드 리스트
- 개발
- 워셜알고리즘
- 학교
- 시스템보안
- 레지스터
- c++
- 야경
- Dreamhack
- 더블버퍼링
- 지뢰찾기
- 드림핵
- 보안
- 컨퍼런스
- BFS
- queue
- STL
- 고양이
- 알고리즘
- 멀티쓰레드
- 인제대학교
- 백준
- 자료구조
- 정보보안
- Select모델
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함