윈도우 공유메모리 예제

공유 메모리는 가장 빠른 프로세스 간 통신 메커니즘입니다. 운영 체제는 여러 프로세스의 주소 공간에 메모리 세그먼트를 매핑하므로 운영 체제 함수를 호출하지 않고도 여러 프로세스가 해당 메모리 세그먼트를 읽고 쓸 수 있습니다. 그러나 공유 메모리를 읽고 쓰는 프로세스 간에는 일종의 동기화가 필요합니다. 공유 데이터는 프로세스가 통신하는 여러 가지 방법 중 하나입니다. 명명된 파이프 및 공유 메모리는 다양한 상황에서 사용됩니다. 두 프로세스는 이름으로 동일한 이름의 파이프에 액세스하고 매핑된 파일 핸들을 통해 공유 메모리에 액세스합니다. 이벤트 개체와 대기 함수를 적절히 사용하여 공유 데이터 읽기 및 쓰기 타이밍을 제어하면 프로세스 동기화가 보장됩니다. 그러나 Windows에는 올바르게 관리하기 위해 매우 신중하게 관리해야 하는 공유 메모리 공간이 있습니다. 공유 메모리 공간에 공간을 할당하는 모든 프로세스는 해당 메모리를 명시적으로 해제합니다. 이는 프로세스가 죽을 때 다소 사라지는 로컬 메모리와 는 대조적입니다. 다음 프로세스는 위에 정의된 DLL에서 제공하는 공유 메모리를 사용합니다. 첫 번째 프로세스는 SetSharedMem을 호출하여 문자열을 작성하고 두 번째 프로세스는 GetSharedMem을 호출하여 이 문자열을 검색합니다. Windows에 대해 이야기하는 경우 주요 장애물은 각 프로세스가 자체 가상 주소 공간에 살고 있다는 것입니다.

불행히도 프로세스에서 프로세스로 일반 메모리 주소를 전달하고 예상한 결과를 얻을 수 없습니다. 반면스레드는 모두 동일한 주소 공간에 살고 있어 스레드가 동일한 방식으로 메모리를 볼 수 있습니다. Windows 운영 체제는 공유 메모리도 제공하지만 이 공유 메모리의 수명은 커널 또는 파일 시스템 수명과 매우 다릅니다. 공유 메모리는 페이지 파일에 의해 백업되고 공유 메모리에 연결된 마지막 프로세스가 소멸되면 자동으로 소멸됩니다. 다음 예제에서는 DLL 진입점 함수가 파일 매핑 개체를 사용하여 DLL을 로드하는 프로세스에서 공유할 수 있는 메모리를 설정하는 방법을 보여 줍니다. 공유 DLL 메모리는 DLL이 로드된 동안에만 유지됩니다. 응용 프로그램은 SetSharedMem 및 GetSharedMem 함수를 사용하여 공유 메모리에 액세스할 수 있습니다. 공유 메모리는 각 프로세스의 다른 주소에 매핑할 수 있습니다.

이러한 이유로 각 프로세스에는 모든 DLL 함수에서 사용할 수 있도록 전역 변수로 선언되는 lpvMem의 자체 인스턴스가 있습니다. 이 예제에서는 DLL 전역 데이터가 공유되지 않는다고 가정하므로 DLL을 로드하는 각 프로세스에는 자체 lpvMem 인스턴스가 있습니다. 이러한 플랫폼에서 공유 메모리는 임시 파일 디렉토리에 생성된 «boost_interprocess» 폴더에 생성된 매핑된 파일로 에뮬레이트됩니다. Windows 플랫폼에서 «일반 AppData» 키가 레지스트리에 있는 경우 «boost_interprocess» 폴더가 해당 디렉터리에서 만들어집니다(XP에서는 일반적으로 «C:문서 및 설정모든 사용자응용 프로그램 데이터»와 Vista «C:ProgramData»)에서 만들어집니다. 해당 레지스트리 키 및 유닉스 시스템이 없는 Windows 플랫폼의 경우 공유 메모리는 시스템 임시 파일 디렉토리(«/tmp» 또는 이와 유사한)에서 만들어집니다. 이 프로세스는 DLL에서 구현한 GetSharedMem 함수를 사용하여 공유 메모리에서 문자열을 읽습니다. 위의 상위 프로세스에서 시작됩니다. RTSS 공유 메모리 개체를 사용하면 RTSS 프로세스 및 Win32 프로세스를 비롯한 여러 프로세스 간에 데이터 블록을 공유할 수 있습니다. 이렇게 하려면 각 프로세스의 스레드에 단일 RTSS 공유 메모리 개체에 대한 자체 프로세스 상대 핸들과 매핑의 가상 주소가 저장되는 위치에 대한 자체 프로세스 상대 포인터가 있어야 합니다.