본문 바로가기
IT

[C++] Memory Mapped File / 메모리 매핑 파일

by %? 2022. 3. 14.
void MMF(WCHAR* szPath)
{
	HANDLE hFile = INVALID_HANDLE_VALUE;
	HANDLE hMap = INVALID_HANDLE_VALUE;
	LPVOID pBuf;

	hFile = CreateFile(
		szPath,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);

	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf("CreateFile Fail : %d\n\n", GetLastError());
		return;
	}

	hMap = CreateFileMapping(
		hFile,
		NULL,
		PAGE_READWRITE,
		0,
		0,
		NULL
	);

	if (hMap == INVALID_HANDLE_VALUE)
	{
		printf("CreateFileMapping Fail : %d\n\n", GetLastError());
		return;
	}

	pBuf = MapViewOfFile(
		hMap,
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		0
	);

	if (pBuf == NULL)
	{
		printf("MapViewOfFile Fail : %d\n\n", GetLastError());
		return;
	}

	UnmapViewOfFile(pBuf);

	CloseHandle(hFile);
	CloseHandle(hMap);
}

[작동 순서]
1. 메모리 매핑할 szPath의 값을 받는 OpenM 함수 생성
2. 각각 CreateFile과 CreateFileMapping 함수값을 받을 hFile, hMap 핸들 객체 생성
3. CreateFile에서 szPath가 존재하면 I/O 권한을 부여받은 hFile 핸들 객체 열기
4. CreateFileMapping에서 hFile에 대해 I/O 권한을 부여받은 hMap 파일 매핑 객체 열기
5. hMap의 주소 공간에 대해 모든 매핑 권한으로 매핑한 pBuf 뷰 반환
6. pBuf에 관해 언매핑
7. hFile과 hMap 핸들 닫기


제가 이해한 것으로는...
가상 머신에 파일에 대한 주소 공간을 매핑하여 파일을 직접 읽고 쓰는 것보다 좀 더 빠르게 읽고 쓰는 것
ㄴ 메모리 매핑 파일
이라고 알고 있습니다.

비록 저는 사용에 실패하여 코드만 이렇게 남기지만... 언젠가 누군가한테는 유용할 거라 생각하여 남깁니다.


[Source]
CreateFileA function (fileapi.h) - Win32 apps | Microsoft Docs

 

CreateFileA function (fileapi.h) - Win32 apps

Creates or opens a file or I/O device. The most commonly used I/O devices are as follows:\_file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, and pipe.

docs.microsoft.com

CreateFileMappingA function (winbase.h) - Win32 apps | Microsoft Docs

 

CreateFileMappingA function (winbase.h) - Win32 apps

Creates or opens a named or unnamed file mapping object for a specified file.

docs.microsoft.com

MapViewOfFile function (memoryapi.h) - Win32 apps | Microsoft Docs

 

MapViewOfFile function (memoryapi.h) - Win32 apps

Maps a view of a file mapping into the address space of a calling process.

docs.microsoft.com