행복한 연어의 이야기

(윈도우 시스템) 20. 메모리 관리 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 20. 메모리 관리

해피살몬 2021. 8. 30. 20:49

16. 컴퓨터 구조 네번째 글을 충분히 이해했다고 가정합니다.

1. 가상메모리 컨트롤

Reserve, Commit, Free

Reserve, Commit, Free 는 Windows 시스템에서 부여할 수 있는 페이지의 상태를 의미한다.

가상메모리 크기 / 페이지 하나당 크기 = 페이지의 개수

Commit 은 실제 물리 메모리에 할당이 이루어진 상태를 말한다.

Free 는 반대로 실제 물리 메모리에 할당이 이루어지지 않은 상태를 말한다.

Reserve 도 Free와 같이 물리 메모리에 할당 되지 않은 상태를 말한다.

언뜻보면 Reserve 와 Free 와 같은 역할을 하는 것 같아보이지만

Reserve 는 Commit 과 Free 의 중간점에 있다고 할수 있다.

페이지를 Reserve 상태로 두면 다른 메모리 할당 함수에 의해

Reserve 페이지는 할당 되지 않는다.

페이지는 중간 위치에서부터 할당을 할 수 없으며 페이지 크기의 배수 단위로 할당을 해야만 한다.

 

VirtualAlloc & VirtualFree 함수

LPVOID VirtualAlloc(
	LPVOID lpAdress,		//예약 및 할당하고자 하는 메모리의 시작 주소
	SIZE_T dwSize,			//할당하고자 하는 메모리의 크기(바이트 단위)
	DWORD flAllocationtype,		//메모리의 할당 타입(ex- Commit, Reserve 등)
	DWORD flProtect			//페이지별 접근방식에 제한을 두는 용도로 사용
);

BOOL VirualFree(
	LPVOID lpAddress,		//해제할 메모리 공간의 시작 주소
	SIZE_T dwSize,			//해제할 메모리크기(바이트 단위)
	DWORD dwFreeType		//Reserve 상태로 반환할건지 Free 상태로 반환할건지
);

가상 메모리 상태를 변경할 수 있는 함수이다.

 

2. 힙(Heap) 컨트롤

링크드 리스트 의 삭제 하는 방식을 떠올렸을때 

링크를 타고 일일이 돌아다니면서 삭제했던 것을 기억할것이다.

이렇게 하나씩 삭제 하는 것 말고 한번에 지울수 있는 방법을 소개하도록 한다.

 

디폴트 힙 & Windows 시스템에서의 힙

 

일반적으로 new delete / malloc free 를 호출하는 경우

프로세스를 생성할때 생성되는 힙, 디폴트 힙(기본 1mb)에 영역을 할당하게 된다.

스택 힙 모두 (설정으로 수정하지 않는 이상) 기본 1mb 로 생성되며스택은 1mb를 넘어갈시 스택오버플로우를

힙은 1mb를 넘어갈시 windows 가 알아서 추가 할당을 해준다.

위 디폴트 힙 말고 추가적으로 힙을 할당해서 사용할 수 있는데(동적 힙, 다이다믹 힙) 이에대한 이점을 소개한다.1. 메모리 단편화의 최소화2. 멀티쓰레드 프로그래밍을 할때 동기화 문제에서 자유로워진다.

 

힙의 생성과 소멸 그리고 할당

HANDLE HeapCreate(
	DWORD flOptions,	//생성되는 힙의 특성(동기화처리 등)
	SIZE_T dwInitialSize,	//초기에 할당할 물리메모리 크기 (Commit 될 크기)
	SIZE_T dwMaximumSIze	//힙의 크기(Reserve 될 크기)
);

BOOL HeapDestroy(
	HANDLE hHeap		//반환할 힙의 핸들
);


LPVOID HeapAlloc(
	HANDLE hHeap,		//메모리 할당이 이루어질 힙의 핸들
	DWORD dwFlags,		//속성 (동기화 등)
	SIZE_T dwBytes		//할당하고자 하는 메모리의 크기
);

BOOL HeapFree(
	HANDLE hHeap,		//해제할 메모리를 담고있는 힙
	DWORD dwFlags,		//속성 (동기화 등)
	lpMem			//해제하 메모리의 시작주소
);
	

위 함수 2개는 힙의 생성과 소멸아래 함수 2개는 힙의 할당과 해제를 하는 함수이다.

 

3. MMF(Memory Mapped File)

MMF 의 뜻은 파일(File)을 메모리(Memory)에 연결(Mapping)시킨다는 의미를 지닌다.

파일의 일부 영역을 가상메모리 일부에 연결시키면 다음과 같은 이점이 있다.

1. 파일을 읽고 수정하고 저장하고, 의 과정을 거치지 않아 프로그래밍 하기 편하다.

2. 메모리가 일종의 캐쉬 역할을 해주어 성능이 향상된다.

 

MMF 구현

HANDLE CreateFileMapping(
	HANDLE hfile,				//메모리에 연결할 파일의 핸들
	LPSECURITY_ATTRIBUTES lpAttributes,	//보안 속성
	DWORD flProtect,			//메모리의 접근권한 지정(읽기/쓰기 등)
	DWORD dwMaximumSizeHigh,		//연결할 메모리의 최대크기의 상위 4바이트
	DWORD dwMaximumSizeLow,			//연결할 메모리의 최소크기의 하위 4바이트
	LPCTSTR lpName				//파일 연결 오브젝트의 이름
);

LPVOID MapViewOfFile(
	HANDLE hFileMappingObject,		//CreateFileMapping 호출로 반환된 오브젝트의 핸들
	DwORD dwDesiredAccess,			//메모리의 접근 권한
	DWORD dwFileOfffsetHigh,		//메모리에 연결할 파일의 시작번지 상위 4바이트
	DWORD dwFileOfffsetLow,			//메모리에 연결할 파일의 시작번지 하위 4바이트
	SIEZ_T dwNumberOfBytesToMap		//메모리에 연결할 실제 크기 (바이트 단위)
);

BOOL UnmapViewOfFile(
	LPCVOID lpBaseAddress			//연결 해제할 메모리의 시작 주소(MapViewOfFile 반환값)
);

구현 순서는 다음과 같다.

1. CreateFile 함수 호출을 통해 파일을 열고 해당 파일의 핸들을 가져온다.

2. CreateFileMapping 함수 호출을 통한 파일 연결 커널 오브젝트 생성

3. MapViewOfFile 함수 호출을 통해 가상메모리에 파일을 연결

 

알고 넘어가야할 것

1. 가상 메모리의 페이지 상태 (Commit, Reserve, Free)

2. 동적 힙 생성 이점

3. MMF

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

Comments