컴퓨터 공부/Win32 API 프로그래밍

[5월 8일 2교시] 메모리 1

려리군 2009. 5. 8. 16:02

Win32 메모리 구조

16비트 환경 메모리 구조

 - 8088/86 : 최대 1메가, segment/offset

 - 80286 : 1메가 + 15메가(보호모드에서만 사용가능)

80386(32비트)

 - 최대 4G 메모리까지 관리 가능.


가상메모리

메모리 + 하드 디스크 페이징 파일.

페이지 단위(약 4K)로 메모리 관리.

가상 주소 공간 -> 페이지 테이블 -> 물리 메모리


C런타임 함수

void *malloc(size_t size);

참고주소 : http://www.winapi.co.kr/cpp/reference/malloc.gif

size바이트 만큼 메모리 할당.

void free(void *memblock);

참고주소 : http://www.winapi.co.kr/cpp/reference/free.gif

memblock에 할당된 메모리를 해제한다.


WIN32 가상메모리 관리 함수

LPVOID WINAPI VirtualAlloc(__in_opt  LPVOID lpAddress, __in      SIZE_T dwSize, __in      DWORD flAllocationType, __in      DWORD flProtect);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx

가상메모리 주소를 예약하거나 (사용가능하도록) 할당한다.

 - lpAddress : 사용할 가상 메모리 주소. 시작주소는 64KB단위(하위 2바이트는 0으로 만듬).

 - dwSize : 사용할 메모리의 바이트양.

 - flAllocationType : 메모리 할당 형태.

    MEM_RESERVE : 메모리를 예약함.(많은 양을 쓸 경우 실제로 나누어 쓰기 위해...)

    MEM_COMMIT : 메모리를 사용 가능하도록 할당함.

 - flProtect : 메모리 접근 형태 지정.

    PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE

    PAGE_GUARD, PAGE_NOACCESS, PAGE_NOCACHE


BOOL WINAPI VirtualFree(__in  LPVOID lpAddress, __in  SIZE_T dwSize, __in  DWORD dwFreeType);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366892(VS.85).aspx

가상메모리 예약을 파기하거나 할당된 메모리를 해제한다.


- 메모리 잠금 함수

  특정 데이터가 RAM에만 존재하게 잠근다.

BOOL WINAPI VirtualLock(__in  LPVOID lpAddress, __in  SIZE_T dwSize);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx

가상 메모리가 후에 page fault가 발생하지 않도록 보장하면서 물리적 주소로 정해지도록 잠근다. 

 - lpAddress : 잠그길 원하는 base(시작) 주소

 - dwSize : 바이트 크기. 잠그길 원하는 영역의 크기.


VirtualUnLock

참고주소 : http://msdn.microsoft.com/en-us/library/aa366910(VS.85).aspx

필요하다면 페이징 파일이 page out될 수 있도록 프로세스의 가상 메모리의 잠금을 해제한다.

BOOL WINAPI VirtualUnlock(__in  LPVOID lpAddress, __in  SIZE_T dwSize);

 - lpAddress : 잠그길 원하는 base(시작) 주소

 - dwSize : 바이트 크기. 해제하길 원하는 영역의 크기.


힙메모리 함수

기본 디폴트 힙의 용량은 1M다.

LPVOID WINAPI HeapAlloc(__in  HANDLE hHeap, __in  DWORD dwFlags, __in  SIZE_T dwBytes);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366597(VS.85).aspx

힙으로부터 메모리의 블록을 할당한다. 할당된 메모리는 이동할 수 없다.

- hHeap : 메모리가 할당될 힙의 핸들.

- dwflags : 메모리 할당 옵션. HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, HEAP_ZERO_MEMORY

- dwBytes : 할당될 바이트 수


BOOL WINAPI HeapFree(__in  HANDLE hHeap, __in  DWORD dwFlags, __in  LPVOID lpMem);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366701(VS.85).aspx

HeapAlloc이나 HeapReAlloc에 의해 할당된 메모리 블록을 해제한다.


HANDLE WINAPI HeapCreate(__in  DWORD flOptions, __in  SIZE_T dwInitialSize, __in  SIZE_T dwMaximumSize);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366599(VS.85).aspx

호출한 프로세스에 의해 사용될 수 있는 힙 객체를 생성한다. 이 함수는 프로세스의 가상 메모리 공간을 예약하고 특정 초기화 부분에 대한 물리적 저장공간을 할당한다.

 - flOption : 메모리 할당 옵션. HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, HEAP_ZERO_MEMOR

- dwInitialSize : 바이트 단위, 힙의 초기 크기.

- dwMaximumSize : 바이트 단위. 힙의 최대 크기.


BOOL WINAPI HeapDestroy(__in  HANDLE hHeap);

참고주소 : http://msdn.microsoft.com/en-us/library/aa366700(VS.85).aspx

특정 힙 객체를 파괴한다. 힙 객체의 모든 페이지를 예약취소 및 해제하며 무효화 시킨다.

 - hHeap : 파괴할 힙 핸들.