개념 : 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 |