티스토리 뷰

c++

윈도우 MMF를 이용한 공유 메모리 사용

삼전동해커 2022. 5. 6. 15:14

메모리 맵 파일을 사용하려면 다음 세 단계를 수행해야한다.

 

- 메모리 맵 파일로 사용할 디스크 상의 파일을 나타내는 커널 오브젝트를 생성하거나 연다.(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
);

 

'c++' 카테고리의 다른 글

c++ 공유 메모리 사용  (0) 2022.05.04
C++ filesystem 사용  (0) 2022.03.15
STL vector 컨테이너  (0) 2021.02.21
C++ this,string 객체,string 배열  (0) 2020.07.06
C++ 객체포인터,객체 배열, 동적 할당  (0) 2020.07.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 28 29 30 31
글 보관함