Programing

Linux 공유 메모리 : shmget () 대 mmap ()?

lottogame 2021. 1. 7. 07:35
반응형

Linux 공유 메모리 : shmget () 대 mmap ()?


에서 스레드 영업 이익은 사용하는 것이 좋습니다 mmap()대신 shmget()리눅스에서 공유 메모리를 얻을 수 있습니다. 나는 방문 페이지와 어떤 문서를 얻기 위해 페이지를하지만, 두 번째는 대한 모호한 예를 제공합니다 mmap().

거의 초보자이고 두 프로세스간에 일부 정보 (텍스트 형식)를 공유해야하는 경우이 shmget()방법을 사용해야 mmap()합니까? 그리고 왜?


두 방법 모두 실행 가능합니다. mmap메소드는 조금 더 제한적 shmget이지만 사용하기 쉽습니다. shmget이전 System V 공유 메모리 모델이며 가장 광범위한 지원을 제공합니다. mmap/ shm_open는 공유 메모리를 수행하는 새로운 POSIX 방식이며 사용하기가 더 쉽습니다. 귀하의 OS가 POSIX 공유 메모리 사용을 허용한다면 나는 그것을 사용하는 것이 좋습니다.

몇 가지 힌트 :

  • fork그때 mmap통해 자녀를 만드는 MAP_ANONYMOUS | MAP_SHARED것이 가장 쉬운 방법입니다. MAP_ANONYMOUS그러나 POSIX에 의해 지정되지 않은 Linux 확장 입니다.
  • 프로세스를 독립적으로 시작하지만 공유 메모리 이름을 제공 할 수있는 경우 shm_open(+ ftruncate) + mmapwith MAP_SHARED는 2/3 호출입니다. librt일부 OS에서 필요합니다 .
  • 당신의 OS가있는 경우 /dev/shm/다음 shm_open의 파일을 여는 것과 같습니다 /dev/shm/.

이것의 많은 부분은 역사와 미래 방향과 관련이 있습니다.

한때 유닉스의 두 가지 주요 (그리고 다소 경쟁적인) 버전이있었습니다. 시스템 V와 BSD입니다. SysV에는 빅 3-공유 메모리, 세마포어 및 메시지 큐를 포함한 자체 버전의 IPC가 있습니다. POSIX는 일을 통합하려고 노력했습니다.

따라서 현재 posix 공유 메모리, MQ 및 세마포어와 sysV 버전의 두 가지 버전이 있습니다. 좀 더 혼란스럽게 만들기 위해 sysV 버전 posix의 일부입니다.

그래서 기본적으로 질문은 Posix 또는 sysV 스타일 공유 메모리를 사용 하시겠습니까? 일반적으로 대부분의 사람들은 장기적인 관점을 취하고 Posix를 선택합니다. 이것이 미래로가는 길이 기 때문입니다. 그러나 현실적으로 sysV는 너무 많은 시스템에 너무 많이 내장되어있어 사라질 것이라는 심각한 의심을 가져야합니다.

따라서 장기적인 요소를 제거하면 프로젝트와 취향에 맞는 것이 무엇인지 결정됩니다. 일반적으로 sysV 버전은 실제로 다소 더 강력한 경향이 있지만 대부분의 사람들이 처음 접촉 할 때 약간 혼란스러워하는 투박한 인터페이스를 가지고 있습니다. 특히 sysV 세마포어 및 메시지 큐에 해당됩니다. 공유 메모리 측면에서 sysV와 posix가 모두 어색하다고 주장 할 수 있습니다. sysV 버전은 투박 ftok하고 핵심적인 요소를 전달하는 반면 posix는 여러 번의 호출과 설정을위한 경쟁 조건으로 끝납니다. 외부에서 보면 posix 버전은 파일 시스템을 활용하고 ipcssysV에서 요구하는 별도의 유틸리티 프로그램 (예 :) 에 의존하지 않고 'rm'과 같은 표준 명령 줄 기능으로 유지 관리 할 수 있다는 장점이 있습니다.

그렇다면 어떤 것을 사용해야합니까? 일반적으로 posix 버전입니다. 하지만 sysV 버전에 대해 잘 알고 있어야합니다. 특정 상황에서 활용할 수있는 posix 버전의 기능을 뛰어 넘는 몇 가지 기능이 있습니다.

참조 URL : https://stackoverflow.com/questions/21311080/linux-shared-memory-shmget-vs-mmap

반응형