윈도우 MMF를 이용한 공유 메모리 사용
메모리 맵 파일을 사용하려면 다음 세 단계를 수행해야한다.
- 메모리 맵 파일로 사용할 디스크 상의 파일을 나타내는 커널 오브젝트를 생성하거나 연다.(CreateFile)
- 파일의 크기와 접근 방식을 고려해 파일 매핑 커널 오브젝트를 생성한다.(CreateFileMapping)
- 포르세스의 주소 공간 상에 파일 매핑 오브젝트의 전체나 일부를 매핑시킨다.(MapViewOfFile)
CreateFile
핸들을 받아와 파일 혹은 오브젝트를 생성하거나 열 수 있는 함수. 이 함수를 사용해 운영체제에게 파일 매핑을 수행할 파일의 물리 저장소를 알려준다.
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
나는 디스크에 존재하는 파일이 아닌 메모리 상에 존재(공유 메모리)하는 데이터를 사용하려 한다.
그래서 createfile은 따로 생성할 필요가 없고 createfilemapping에서 따로 설정할 수 있다.
CreateFileMapping
MMF 커널 객체를 만들고 해당 핸들을 반환한다.
HANDLE CreateFileMappingA(
HANDLE hFile,
PSECURITY_ATTRIBUTES psa,
DWORD fdwProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCSTR lpName);
HANDLE hFile : createfile을 사용해 만든 오브젝트를 다루는 핸들. 여기에 INVALID_HANDLE_VALUE를 사용해 페이징파일을 이용해 메모리를 공유한다.
PSECURITY_ATTRIBUTES psa : 보안관련 인자.
DWORD fdwProtect : 페이지 옵션으로 PAGE_READONLY, PAGE_READWRITE 등이 들어감.
DWORD dwMaximumSizeHigh : 매핑할 범위를 지정하는 상위 4바이트
DWORD dwMaximumSizeLow : 매핑할 범위를 지정하는 하위 4바이트
LPCSTR lpName : 고유한 객체 이름을 부여.
MapViewOfFile
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
MMF 객체를 대상으로 실제 메모리 매핑을 수행하여 그 메모리의 시작 번지를 반환한다.
hFileMappingObject : MMF 객체 핸들을 연결
dwDesiredAccess : 접근 권한 설정, FILE_MAP_READ, FILE_MAP_WRITE 등
dwFileOffsetHigh : 메모리 주소가 연결될 크기. 상위 4바이트
dwFileOffsetLow : 메모리 주소가 연결될 크기. 하위 4바이트
dwNumberOfBytesToMap : 오프셋으로부터 원하는 크기를 설정.
위 함수들을 사용해 공유 메모리에 작성을한 후 아래 함수를 사용해 매핑을 해제한다.
UnmapViewOfFile
BOOL UnmapViewOfFile(
[in] LPCVOID lpBaseAddress
);
CloseHandle
BOOL CloseHandle(
[in] HANDLE hObject
);