728x90

이번 내용은 MMF(Memory Mapped File) 을 이용한 프로세스간의 메모리 공유입니다.
 
일전에 설명드렸다시피(링크) Win32 이상의 환경에서는
 
프로세스의 주소공간은 독립적으로 관리되기 때문에
 
어떤 하나의 프로세스는 다른 프로세스의 주소공간을 공유할 수 없습니다.
 
A라는 프로세스의 0x1234라는 주소값은 B라는 프로세스의 0x1234와는 전혀 다른 공간입니다.
 
이런 메모리 관리 구조는 OS를 안정적이고 견고하게 만들어주었지만
 
한편으로는 프로그램 사이에 정보를 주고 받기가 어렵게 되어버렸습니다.
 
프로세스 사이에 정보를 공유하기 위해서 MMF라는 방식을 사용합니다.
 
MMF는 이름 그대로 파일을 메모리에 맵핑하기 위해서 사용되는 기법입니다.
 
간단하게 설명하자면, 파일을 열어서 해당 파일을 메모리에 맵핑시켜서 사용하는 것입니다.
 
MMF를 이용해서 하드디스크의 파일을 프로세스의 주소 공간에 연결해서 사용이 가능합니다.
 
하지만 여기서는 파일을 여는 것이 아닌 프로세스가 서로 접근할 수 있는 메모리의 공유 영역을
 
생성하기 위해서 사용하겠습니다.
 
File Mapping object는 Named kernel object로 생성되면 모든 프로세스에 영향을 줍니다.
 
뮤텍스와 유사한데 한 쪽 프로세스에서 뮤텍스를 생성하면 모든 프로세스에 영향을 주듯이
 
이것도 같은 이름의 File Mapping object는 어느 프로세스나 사용이 가능합니다.
 
전에 커널 영역은 접근이 불가능하다고 했는데,
 
Windows가 제공하는 함수들을 이용해서 정해진 방법으로
 
커널 오브젝트에 접근이 가능합니다.
 
그럼 예제를 먼저 보도록 하겠습니다.
 
일단 A 프로세스의 코드입니다.

 

그리고 B 프로세스의 코드입니다.

 

중요한 WndProc과 정의 부분만 캡쳐해서 올립니다.

 

일단 A 프로세스에서는 WM_CREATE부분에서 버튼 하나를 만들어주고

 

CreateFileMapping 함수를 이용해서 메모리 영역을 맵핑시키는데 중요한 것은

 

맨 처음 인자를 INVALID_HANDLE_VALUE(0xFFFFFFFF)로 주는 것이 핵심입니다.

 

일반적인 상황이라면 CreateFile에서 반환되는 핸들을 넣지만 여기서는 저 값을 넣어줍니다.

 

그리고 MapViewOfFile 함수를 이용해서 파일(여기서는 메모리의 일정 부분)의 뷰를

 

주소 공간에 맵핑시킵니다.

 

그럼 모든 준비는 끝나고 마우스로 버튼을 클릭하게 되면

 

MapViewOfFile 함수가 리턴하는 포인터에 문자열을 입력합니다.

 

_T("Message from ProcA")라는 문자열이 포인터가 가리키는 메모리 영역에 저장이 될 것입니다.

 

그리고 ProcB의 핸들(Window Handle)을 찾아서 거기에 메시지를 날립니다.

 

B에서 A가 기록한 문자열을 읽게 하기 위해서죠.

 

B 프로세스는 CreateFileMapping 대신에 OpenFileMapping을 사용하고 있습니다.

 

이미 생성된 object를 단순하게 열기만 할 경우에는 Open류의 함수를 이용하시면 됩니다.

 

WM_SHAREDMEMORY 메시지가 들어오면 B 프로세스 또한 MapViewOfFile 가 리턴한

 

포인터를 이용해서 해당 메모리 부분을 읽습니다.

 

일반적으로 A의 주소 공간과 B의 주소 공간은 완전히 격리되어있어서

 

A의 주소 공간을 B는 절대 볼 수 없지만 Name kernel object를 이용해서 공유가 가능해졌습니다.

 

그리고 종료시킬 때에는 시작시의 역순으로 UnmapViewOfFile 함수를 호출하고

 

CloseHandle로 열려진 핸들을 닫는 것으로 끝이 납니다.

 

어려운 것 같지만 차근차근 읽어보면 전혀 어렵지 않습니다.

 

Windows가 프로세스의 주소 공간을 실제 가상 메모리(실제 메모리)에 맵핑시켜주는데

 

이름을 갖는 커널 오브젝트가 같은 실제 가상 메모리에 연결되는 점을 이용해서

 

어디에서나 같은 가상 메모리를 가리키게 처리해주고 그걸 그냥 읽고 쓰기만 하는겁니다.

 

간단하게 보자면 A 프로세스가 파일에 기록을 하고 메시지를 날리면

 

B는 파일의 내용을 읽는 것으로도 프로세스간 데이터의 공유는 가능합니다.

 

하지만 그것은 조금 비효율적일 수 있기 때문에 위와 같은 방법을 이용해서 공유를 하는것이죠.

 

이것으로 MMF를 이용한 프로세스간 메모리 공유를 마치겠습니다.

 

 

출처 : http://psychoria.blog.me/40113892474 

728x90

+ Recent posts