linux 공유메모리 예제

총 4개의 데이터 복사본이 필요합니다(읽기 2개 및 쓰기 2개). 따라서 공유 메모리는 둘 이상의 프로세스가 메모리 세그먼트를 공유하도록 하는 방법을 제공합니다. 공유 메모리를 사용하면 입력 파일에서 공유 메모리로, 공유 메모리에서 출력 파일까지 두 번만 데이터가 복사됩니다. memwriter 프로그램이 성공적으로 실행되면 시스템은 백업 파일을 만들고 유지 관리합니다. 내 시스템에서 파일은 /dev /shm/shMemEx이며 shMemEx는 공유 저장소에 대한 내 이름 (헤더 파일 shmem.h에 있음)으로 제공됩니다. memwriter 및 memreader 프로그램의 현재 버전에서, 문: 이 첫 번째 코드 예제에서, IPC를 통해 공유 되는 데이터는 텍스트: 셰익스피어의 플레이 리처드 III에서 두 줄. 그러나 공유 파일의 내용은 볼륨감 있는 임의 바이트(예: 디지털화된 동영상)일 수 있으며, 이로 인해 파일 공유는 매우 유연한 IPC 메커니즘이 될 수 있습니다. 단점은 액세스가 읽기 또는 쓰기와 관련이 있는지 여부에 관계없이 파일 액세스가 상대적으로 느리다는 것입니다. 언제나 그렇듯이 프로그래밍에는 장단점이 있습니다. 다음 예제는 공유 파일 이 아닌 공유 메모리를 통해 IPC의 거꾸로 성능이 향상됩니다. shmat을 사용하여 shmid로 식별된 공유 메모리 세그먼트를 호출 프로세스의 주소 공간에 연결하는 다음은 위에서 정의한 함수를 사용하여 버퍼를 할당하는 예제 프로그램입니다. 부모 프로세스는 메시지, 포크를 작성한 다음 자식이 버퍼를 수정할 때까지 기다립니다.

두 프로세스 모두 공유 메모리를 읽고 쓸 수 있습니다. 서버 프로그램은 클라이언트에서 사용할 공유 메모리 세그먼트를 할당해야 하므로 클라이언트를 실행하기 전에 서버를 실행해야 합니다. 이 작업을 수행하는 한 가지 방법은 창에서 서버를 시작한 다음 두 번째 창으로 이동하여 클라이언트를 시작하는 것입니다. mmap에 대한 첫 번째 인수는 NULL이며, 이는 시스템이 가상 주소 공간에서 메모리를 할당할 위치를 결정한다는 것을 의미합니다. 대신 주소를 지정하는 것은 가능하지만 까다롭습니다. MAP_SHARED 플래그는 할당된 메모리가 프로세스 간에 공유 가능하며 마지막 인수(이 경우 0)는 공유 메모리의 오프셋이 첫 번째 바이트여야 한다는 것을 의미합니다. 크기 인수는 할당할 바이트 수(이 경우 512)를 지정하고 보호 인수는 공유 메모리를 기록하고 읽을 수 있음을 나타냅니다. shmget(): int shmget (key_t, size_tsize, intshmflg); 성공적으로 완료되면 shmget()은 공유 메모리 세그먼트에 대한 식별자를 반환합니다. 다음은 memwriter 및 memreader 프로그램이 공유 메모리를 통해 통신하는 방법에 대한 개요입니다: 대기가 끝나면 memreader는 공유 메모리에서 ASCII 바이트를 읽고 정리하고 종료합니다. mmap() 함수는 액세스 및 사용 권한을 제어하기 위해 고도로 사용자 정의 가능한 매개 변수를 사용하여 메모리 버퍼를 할당하고 필요한 경우 파일 시스템 저장소로 백업하는 데 사용할 수 있습니다.

프로세스는 실행 중인 프로그램이며 각 프로세스에는 프로세스가 액세스할 수 있는 메모리 위치로 구성된 자체 주소 공간이 있습니다. 프로세스에는 실행 가능한 명령 시퀀스인 하나 이상의 실행 스레드가 있습니다. 프로세스 내의 스레드는 다양한 리소스, 특히 주소 공간을 공유합니다. 따라서 프로세스 내의 스레드는 공유 메모리를 통해 직접 통신할 수 있지만 일부 최신 언어(예: Go)는 스레드 안전 채널 사용과 같은 보다 체계적인 접근 방식을 권장합니다.