c++ 공유메모리 예제

c++ 공유메모리 예제
2 Agosto, 2019 fabio

서버 프로세스는 공유 메모리 개체를 만들고 매핑하고 모든 바이트를 값으로 초기화합니다. 그런 다음 클라이언트 프로세스는 공유 메모리를 열고 매핑한 다음 데이터가 올바르게 초기화되어 있는지 확인합니다. 클라이언트가 공유 메모리에 연결하기 전에 서버가 종료되면 공유 메모리 세그먼트가 메모리에 연결되지 않을 때 공유 메모리 세그먼트가 소멸되므로 클라이언트 연결이 실패합니다. 앞서 언급했듯이 shared_memory_object 클래스를 사용하여 여러 프로세스에서 매핑할 수 있는 공유 메모리 세그먼트를 만들고 열고 삭제해야 합니다. 우리는 그 공유 메모리 개체의 액세스 모드를 지정할 수 있습니다 (읽기 만 또는 읽기 쓰기), 마치 그것은 파일 처럼: Windows 공유 메모리 생성 휴대용 공유 메모리 생성에서 조금 다른: 세그먼트의 크기는 개체를 만들 때 지정 해야 합니다. 공유 메모리 개체와 같이 runcate를 통해 지정할 수 없습니다. 공유 메모리에 연결된 마지막 프로세스가 소멸되면 공유 메모리가 소멸되므로 네이티브 Windows 공유 메모리에 대한 지속성이 없습니다. Boost.Interprocess는 XSI 공유 메모리사용을 용이하게 하기 위해 간단한(xsi_shared_memory) 및 관리형(관리형_xsi_shared_memory) 공유 메모리 클래스를 제공합니다. 또한 간단한 xsi_key 클래스로 키 생성을 래핑합니다. 많은 UNIX 시스템에서 OS는 또 다른 공유 메모리 메커니즘인 XSI(X/개방형 시스템 인터페이스) 공유 메모리 세그먼트(“시스템 V” 공유 메모리라고도 함)를 제공합니다. 이 공유 메모리 메커니즘은 매우 인기 있고 이식가능하며 파일 매핑 의미 체계를 기반으로하지 않지만 특수 함수 (shmget, shmat, shmdt, shmct…)를 사용합니다.

shmat(): 공유 메모리 세그먼트를 사용하려면 shmat()를 사용하여 자신을 연결해야 합니다. 보이드 *shmat (int shmid, 보이드 * shmaddr, int shmflg); shmid는 공유 메모리 ID입니다. shmaddr는 사용할 특정 주소를 지정하지만 0으로 설정해야하며 OS는 자동으로 주소를 선택합니다. shmctl () : 공유 메모리에서 분리하면 파괴되지 않습니다. 그래서, shmctl()을 파괴하는 것이 사용된다. shmctl (int shmid, IPC_RMID, NULL); 공유 메모리 사용의 간단한 예를 살펴보겠습니다. 서버 프로세스는 공유 메모리 개체를 만들고 매핑하며 모든 바이트를 값으로 초기화합니다. 그런 다음 클라이언트 프로세스가 공유 메모리를 열고 매핑한 다음 데이터가 올바르게 초기화되어 있는지 확인합니다. 여러 프로세스가 동일한 파일/공유 메모리를 매핑하는 경우 매핑 주소는 각 프로세스마다 확실히 다릅니다. 각 프로세스가 다른 방식으로 주소 공간을 사용했을 수 있기 때문에(예: 다소 동적 메모리 할당) 파일/공유 메모리가 동일한 주소에 매핑될 것이라는 보장은 없습니다. 참조는 주로 포인터로 구현되기 때문에 포인터와 동일한 문제가 발생합니다.

그러나 현재 C++에서 완전히 실행 가능한 스마트 참조를 만들 수 없습니다(예: operator .() 오버로드할 수 없습니다). 따라서 사용자가 개체를 공유 메모리에 넣으려면 개체에 멤버로 (스마트 또는 아님) 참조를 가질 수 없습니다. Boost.Interprocess는 POSIX 의미 체계 측면에서 휴대용 공유 메모리를 제공합니다. POSIX에서 정의한 대로 일부 운영 체제는 공유 메모리를 지원하지 않습니다: 공유하는 데이터가 읽기 전용 데이터인 경우 한 스레드에서 읽은 데이터가 다른 스레드가 동일한 데이터를 읽는지 여부에 영향을 받지 않으므로 문제가 없습니다.