티스토리 뷰
메모리
윈도우(OS)는 각 프로세스에 4GB 가상메모리를 할당. (32비트)
프로세스는 자신의 고유 영역 외 다른 영역은 접근 안됨.
가상메모리
물리적 메모리 용량이 부족하면 하드디스크 일부를 메모리로 사용하는 기법
당장 사용하지 않는 메모리에 있는 DATA를 하드디스크의 페이징 파일이라는 곳에 옮겨 사용 가능한 물리적인 메모리를 늘려주는 방식
물리적 메모리 + 하드디스크 페이징파일 = 가상메모리
페이지(4KB) 단위로 할당/해제 관리됨 (4KB 보다 작은 경우 낭비되는 단점)
가상메모리 할당
LPVOID VirtualAlloc(
LPVOID 할당하려는메모리주소, // NULL이면 자동할당
DWORD 메모리크기를BYTE단위로지정,
DWORD 할당방법, // MEM_RESERVE | MEM_COMMIT
DWORD 할당페이지접근타입); // 보통 PAGE_READWRITE 로 지정
<할당방법>
MEM_RESERVE 물리적인 메모리의 할당없이 주소공간에만 예약
MEM_COMMIT 물리적인 메모리를 할당
MEM_TOPDOWN 가급적 높은 주소에 메모리 할당
<접근타입>
PAGE_READONLY
PAGE_READWRITE
PAGE_EXCUTE 실행만가능하고 읽고/쓰기 안됨
PAGE_EXCUTE_READ
PAGE_EXCUTE_ERADWRITE
PAGE_GUARD 보호 페이지를 지정, 메모리의 끝을 표시하는 용도로 주로 사용
PAGE_NOACCESS 접근금지
PAGE_NOCACHE 캐시를 못하게한다
가상메모리 해제
BOOL VirtualFree(
LPVOID 해제할메모리주소,
DWORD 해제할메모리크기BYTE단위,
DWORD 해제방법); // MEM_DECOMMIT
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 |
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
BOOL bMemFree;
static TCHAR* ptr;
RECT rect = { 10, 40, 100, 60 };
switch (message)
{
case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
ptr = (TCHAR*)VirtualAlloc(NULL, sizeof(TCHAR) * 10, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (ptr != NULL)
TextOut(hdc, 10, 20, L"메모리를 할당 하였습니다", 20);
for (int i = 0; i < 10; i++)
ptr[i] = 'a' + i;
TextOut(hdc, 10, 40, ptr, wcslen(ptr));
ReleaseDC(hWnd, hdc);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hWnd);
bMemFree = VirtualFree(ptr, sizeof(TCHAR) * 10, MEM_DECOMMIT);
if (bMemFree != 0)
TextOut(hdc, 10, 20, L"메모리가 해제되었습니다.", 20);
InvalidateRect(hWnd, &rect, TRUE);
break;
|
cs |