본문 바로가기
Programming/MFC,C++

MMF(Memory Mapped File)

by 기적 2013. 3. 14.

<퍼옴> 
안녕하세요 
mmf (Memory mapped file) 에대해서 알고싶읍니다 어디강좌같은것이 있으면 부탁드립니다 
mmf를이용해서 파일을 열고 파일을 읽어서 가공하고 닫고 하는작업을 해야됩니다 
저는 텍스트가 포함된 바이너리파일을 열고 텍스트단위로 읽어서 줄바꿈기준으로 줄단위로 내용을 
추출해야됩니다 방법좀 부탁드립니다 

보니까 MapViewOfFile이란함수가있던데여, 이함수의 리턴값이 뭔가여사용법 좀 알았으면 합니다 
즐거운하루되세요 

[답변-즐거운악몽님이 답변하신 내용입니다.] 

MMF(Memory Mapped File)이란 파일과 메모리 객체를 연결한다는 말 입니다...ㅡㅡ; 
정말입니다...영문 그대로 생각하시면 됩니다...^^ 

좀 더 풀어서 이야기 하면 파일과 메모리 객체를 연결 시킨 후 그 메모리 객체에 이름을 지어줍니다. 
그 후 그 이름을 이용하여 메모리에 데이터를 읽고 쓰고 하는 작업을 하게되면 
그 내용이 메모리와 연결되어 있는 파일에 똑같은 효과가 적용되는 구조입니다. 

이와 더불어 또 하나의 이슈가 있다면 이는 MMF를 이용한 프로세스간의 데이터 공유입니다. 
보통 공유 메모리라 부르죠. 앞의 설명과 연결하여 이야기 하면 파일과 매핑된 메모리 객체에 
이름을 부여합니다. 그후 다른 프로세서에서 그 이름을 갖고 해당 메모리 객체를 찾아서 
접근(데이터읽기,쓰기)하면서 작업을 하게 되는겁니다. 지금까지는 실제적으로 파일을 메모리와 
연결시켜 데이터를 공유 하는것으로 이야기 하였습니다만 반드시 파일을 매핑 시킬 필요는 없습니다. 

파일 부분을 지정하지 않고, 운영체제가 알아서 만들라고 지정 
(파일명 적는곳에 INVALID_HANDLE_VALUE 해주면 됩니다)하면 메모리 객체만 생성됩니다. 
그리고 이 메모리 객체에 이름을 지어줍니다. 렇게 하고나면 메모리 상에 메모리영역이 확보되고 
각각의 프로세서들이 이 영역을 이름으로 아서 접근(데이터읽기,쓰기)하면서 작업을 하게 되는겁니다. 

순수한 공유 메모리를 통해 프로세서간의 공유의 예 

프로세서 1) 

// "test"라는 이름으로 크기 1024 이며 읽고쓰기가 가능한 상태로 메모리 객체를 만든다.. 
// 파일명 지정 안함.(파일과 연결 안함) 
HANDLE hMapping = ::CreateFileMapping (INVALID_HANDLE_VALUE,        
                                                      NULL, PAGE_READWRITE, 0, 1024, "Test"); 

// 생성된 메모리 객체에 접근하여 시작 위치를 얻어온다. 
LPVOID lpData = ::MapViewOfFile (hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 1024); 
strcpy(lpData, "tipsware.com");  // 공유메모리 영역에 문자열 tipsware.com 를 입력한다. 
::UnmapViewOfFile (lpData); // 접근했던 메모리객체를 연관성을 끊는다. 


프로세서 2) 

// 이미 생성된 "Test"라는 메모리 객체를 Open 한다. 
HANDLE hMapping = ::OpenFileMapping (FILE_MAP_ALL_ACCESS, FALSE, "Test"); 

// Open된 메모리 객체에 접근하여 시작 위치를 얻어온다. 
LPVOID lpData = ::MapViewOfFile (hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 1024); 
char str[1024]; 
strcpy (str, lpData); // 공유메모리에 있는 문자열 tipsware.com 을 str 배열에 복사한다. 
::UnmapViewOfFile (lpData); // 접근했던 메모리객체를 연관성을 끊는다. 
::CloseHandle (hMapping); // 공유메모리를 삭제한다.



http://www.tipssoft.com/bulletin/tb.php/old_bbs/145

댓글