공유 메모리 예제

2.6 커널을 기반으로 한 Linux 배포판및 나중에 RAM 디스크의 형태로 공유 메모리로 /dev/shm을 제공하며, 특히 메모리에 저장된 세계적인 리디렉토리(시스템의 모든 사용자가 파일을 만들 수 있는 디렉토리)로 제공됩니다. RedHat 및 데비안 기반 배포판에는 기본적으로 포함됩니다. 이러한 유형의 RAM 디스크에 대한 지원은 커널 구성 파일 내에서 완전히 선택 사항입니다. [5] 우리가 본 예제에서 파일 또는 공유 메모리 콘텐츠는 프로세스의 주소 공간에 매핑되지만 주소는 운영 체제에서 선택했습니다. shm_open에서 만든 공유 메모리는 영구적입니다. 프로세스에서 명시적으로 제거될 때까지 시스템에 유지됩니다. 이 프로세스가 충돌하 고 공유 메모리를 정리 하지 못하는 경우 시스템 종료 까지 유지 됩니다 단점이 있다. 우리가 볼 수 있듯이, 두 개의 복사본이 있다, 하나는 네트워크에서 네트워크와 메모리에 네트워크에서 다른 하나. 그리고 이러한 복사본은 일반적으로 비용이 많이 드는 운영 체제 호출을 사용하여 만들어집니다. 공유 메모리는 이 오버헤드를 방지하지만 두 프로세스를 동기화해야 합니다: 일부 C++ 라이브러리는 공유 메모리 기능에 대한 이식 가능하고 개체 지향적인 액세스를 제공합니다. 예를 들어 부스트에는 Boost.Interprocess C++ 라이브러리[7]가 포함되어 있으며 Qt는 QSharedMemory 클래스를 제공합니다.

[8] 공유 메모리 개체가 없거나 다른 프로세스에서 열리는 경우 이 함수가 실패할 수 있습니다. 이 함수는 표준 C int remove(const char *path) 함수와 유사합니다. UNIX 시스템에서 shared_memory_object::remove 호출 shm_unlink: 여러 프로세스가 동일한 파일/공유 메모리를 매핑하는 경우 매핑 주소는 각 프로세스마다 확실히 다를 수 있습니다. 각 프로세스가 다른 방식으로 주소 공간을 사용했을 수 있기 때문에(예: 다소 동적 메모리 할당) 파일/공유 메모리가 동일한 주소에 매핑될 것이라는 보장은 없습니다. 일단 생성하거나 열리면 프로세스의 주소 공간에서 공유 메모리 개체를 매핑하기만 하면 됩니다. 사용자는 전체 공유 메모리 또는 일부만 매핑할 수 있습니다. 매핑 프로세스는 mapped_region 클래스를 사용하여 수행됩니다. 클래스는 공유 메모리 또는 매핑 기능(예: 파일)이 있는 다른 장치에서 매핑된 메모리 영역을 나타냅니다.

mapped_region는 모든 memory_mappable 개체에서 만들 수 있으며, 당신이 상상할 수 있듯이 shared_memory_object는 memory_mappable 개체입니다: 공유 메모리 세그먼트를 만들고 여러 프로세스가 관련될 때 매핑하는 것은 약간 지루할 수 있습니다. UNIX 시스템에서 fork() 운영 체제 호출을 통해 프로세스가 관련되는 경우 익명 공유 메모리를 사용하여 더 간단한 방법을 사용할 수 있습니다. 명령 인수에 따라 fork()로 새 프로세스가 시작되고 file_name 변수만 읽는 동안 공유 메모리에 저장된 current_path 변수를 읽고 수정해야 합니다. 이러한 이유로 네이티브 windows 공유 메모리를 사용 하 여 커널 또는 파일 시스템 지 속성을 시뮬레이션 하는 효과적인 방법은 없습니다 및 Boost.interprocess 메모리 매핑 된 파일을 사용 하 여 공유 메모리를 에뮬레이트 합니다. 이렇게 하면 POSIX와 Windows 운영 체제 간의 이식성이 보장됩니다. 우리가 볼 수 있듯이 네이티브 windows 공유 메모리 클라이언트를 시작 하기 전에 공유 메모리가 소멸 되지 않도록 동기화 필요 합니다. 파일 매핑은 프로세스 간 통신에만 사용될 뿐만 아니라 파일 사용을 단순화하는 데도 사용할 수 있으므로 사용자는 파일 관리 기능을 사용하여 파일을 작성할 필요가 없습니다. 사용자는 프로세스 메모리에 데이터를 쓰고 운영 체제는 데이터를 파일에 덤프합니다. 두 프로세스 모두 일반 작업 메모리와 같은 공유 메모리 영역에 액세스할 수 있기 때문에 이는 매우 빠른 통신 방법입니다(명명된 파이프, 유닉스 도메인 소켓 또는 CORBA와 같은 IPC의 다른 메커니즘과 는 반대). 반면에 통신 프로세스가 동일한 컴퓨터에서 실행되어야 하므로 확장성이 낮습니다(다른 IPC 방법의 경우 유닉스 도메인 소켓이 아닌 인터넷 도메인 소켓만 컴퓨터 네트워크를 사용할 수 있음) 메모리를 공유하는 프로세스가 별도의 CPU에서 실행되고 기본 아키텍처는 캐시 일관성이 없습니다.

Ce contenu a été publié dans Non classé par samuel. Mettez-le en favori avec son permalien.