본문 바로가기

Windows/_System Programming

MMF(Memory Mapped File)

개념 : File 을 Memory 에 Mapping(연결)


가상 메모리 중 파일에 연결되어 있는 영역에 데이터를 저장한다.

이렇게 메모리에 저장된 데이터는 실제 파일에도 영향을 미친다.

즉, 데이터가 메모리뿐만 아니라 메모리에 연결된 파일에도 저장되는 것이다.


장점 :

1. 프로그래밍 편리 : 메모리상에 저장된 데이터를 조작하는 방식으로 파일 내 데이터를 조작할 수 있다.

2. 성능 향상 : 메모리는 중간에서 파일과 데이터의 캐쉬 역할을 하여 성능을 향상시킨다.





MMF 구현 :

1. 파일 개방 : CreateFile()

2. 파일 연결 오브젝트 생성 : CreateFileMapping()

HANDLE CreateFileMapping(
          HANDLE hFile,                                        // 메모리에 연결할 파일의 핸들
          LPSECURITY_ATTRIBUTES lpAttributes,    // 보안속성
          DWORD flProtect,             // 파일과 연결된 메모리의 접근권한
                                               // PAGE_READONLY : 읽기만 가능
                                               // PAGE_READWRITE : 읽기 쓰기 가능
                                               // PAGE_WRITECOPY : 데이터를 쓸때 복사한다
                                               // SEC_COMMIT , SEC_RESERVE. 비트 단위 OR 연산으로 함께 설정가능        DWORD dwMaximumSizeHigh,                 // 연결할 메모리 최대 크기의 상위 4바이트
                                                                       // 4GB 이상이 아니라면 0
          DWORD dwMaximumSizeLow,                 // 연결할 메모리 최대 크기의 하위 4바이트
                                                                      // 0 전달 : 첫번째 인자로 전달된 핸들의 파일 크기
          LPCTSTR lpName                                   // 파일 연결 커널 오브젝트의 이름
);


3. 가상 메모리에 파일 연결 : MapViewOfFile()

LPVOID MapViewOfFile(
          HANDLE hFileMappingObject,       // 파일 연결 커널 오브젝트의 핸들
          DWORD dwDesiredAccess,          // 연결된 메모리의 접근 권한
          DWORD dwFileOffsetHigh,             // 메모리에 연결할 파일의 오프셋(시작 위치)의 상위 4 바이트 지정
          DWORD dwFileOffsetLow,             // 메모리에 연결할 파일이 오프셋의 하위 4 바이트 지정
          SIZE_T dwNumberOfBytesToMap // 메모리에 연결할 실제 크기를 바이트 단위로 지정
);                                                         // 오프셋을 기준으로 지정된 바이트만큼 메모리에 연결.
                                                            // 0 전달시 오프셋부터 파일의 끝까지 메모리에 연결

4. 해제 : UnmapViewOfFile()

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


(추가 : 메모리에 캐시된 데이터를 즉각 파일에 저장하는 함수 :

BOOL FlushViewOfFile(
          LPCVOID lpBaseAddress,                         // 파일에 저장할 메모리의 시작 주소
          SIZE_T dwNumberOfBytesToFlush            // 파일에 저장할 데이터 크기를 바이트 단위로 지정
);                                                                     // 0 전달 : 연결된 메모리 영역의 끝까지 파일로 저장)




Copy-On-Write(COW) :

개념 : 데이터를 쓸때 복사한다

기본 데이터를 참조하다가 변경이 필요할 때 데이터를 복사해서 저장하며 그 이후부터는 복사본을 참조한다.

(참고 : 원본 데이터는 보존된다)


구현 :

CreateFile 함수를 호출할때 읽기/쓰기모드로 개방한다.

CreateFileMapping 함수의 세번째 인자를 PAGE_WRITECOPY 로 설정한다.

MapViewOfFIle 함수의 두번째 인자를 FILE_MAP_COPY 로 설정한다.

'Windows > _System Programming' 카테고리의 다른 글

메모리 컨트롤  (0) 2010.03.24
메모리 계층(Memory Hierarchy)  (0) 2010.03.24
라이브러리(Library)  (0) 2010.03.11
비동기 I/O 와 APC  (0) 2010.03.08
디렉터리 컨트롤  (0) 2010.03.08