2017-03-01 1 views
0

mmap()으로 설정하면 프로세스가 부모에서 공유 메모리로 매핑을 상속해야합니다. 부모를 공유하지 않는 프로세스간에 메모리를 공유 할 수있는 방법이 있습니까? shmat()이 최선의 솔루션 인 것처럼 보이지만 프로세스가 종료/종료시 메모리를 분리하지 않으면 정리가 필요합니다.shmat() 등은 Linux 커널에서 어떻게 구현됩니까? 메모리를 공유 할 수있는 다른 방법이 있습니까?

도메인 소켓은 익명 메모리를 사용하는 경우 mmap

+0

프로세스는 메모리 맵에 사용되는 * backing *을 공유 할 수 있습니다. 일반적으로 이것은 tmpfs ('/ dev/shm /'에 있음)의 백업 파일에 대한 열린 파일 설명자 일 뿐이지 만 다른 옵션도 있습니다. 매핑을 공유하는 것은 기본적으로 프로그래머 관점에서 똑같은 방식으로 동작 할지라도 서로 다른 매핑에 사용되는지지를 공유하는 것과는 다른 메커니즘이기 때문에이를 대답으로 작성하지 않았습니다. –

답변

2

이 프로세스는 부모로부터 매핑을 상속해야합니다 ... 공유 메모리에 가깝습니다. 그러나 매핑이 파일에 의해 뒷받침되는 경우 그러한 요구 사항은 없습니다. shmat, 일명 System V 공유 메모리는 문제가없는 것이 아니며, 전통적으로 제한된 리소스 였지만 한도를 높이려면 sysctl과 root를 사용해야합니다.

mmap 두 프로세스 모두 동일한 파일을 열고 매핑 할 수 있으며 다음 파일의 연결을 해제 할 수 있습니다. 이제 모든 프로세스가 파일을 종료하면 자동으로 제거됩니다. 또는 처음에 연결 해제 될 수 있습니다. 서버 프로세스는 유닉스 소켓을 통해 열린 파일 디스크립터를 클라이언트에 공유 할 수 있습니다.

물론 파일 백업과 함께 mmap을 사용하면 매핑을 백업하기 위해 실제 디스크 공간이 필요하며 매핑은 디스크로 플러시됩니다. ((2) 등하는 shmget (2)은 shmop) 이전입니다

시스템 V 공유 메모리 : 당신이 디스크 파일에 의해 백업되지 않습니다 매핑을 원하는 경우에

, 당신은 POSIX shared memory objects을 사용할 수 있습니다 공유 메모리 API. POSIX 공유 메모리는 더 간단하고 잘 설계된 인터페이스를 제공합니다. 반면에 POSIX 공유 메모리 은 System V 공유 메모리보다 다소 덜 널리 사용 가능합니다 (특히 구형 시스템에서). 이러한 본질적 /dev/shm의 파일 만이를 사용할 수있는 휴대용 방법입니다 리눅스

만들고 shm_open로를 열 수 있습니다. 다시 말하지만 공유 메모리 객체가 shm_unlink과 연결이 해제 된 경우에도 공유 메모리 객체가 열린 프로세스는 유닉스 도메인 소켓을 통해 열린 파일 디스크립터를 보낼 수 있으며 수신자는 디스크립터를 사용하여 공유 메모리를 그 프로세스 공간.

따라서 같은 : 첫 번째 과정에서

fd = shm_open("/my_shared_mem", O_RDWR|O_CREAT, 0700); 
ftruncate(fd, 64 * 4096); 
shared_mem = mmap(NULL, 64 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0) 

는, 두 번째는 O_RDWR 열 수 및 절단 할 필요가 없습니다. 공유 메모리 개체를 제거하려면 shm_unlink 사용

shm_unlink("/my_shared_mem"); 

즉시 /dev/shm에서 연결을 해제 할; 열린 프로세스는 계속 사용할 수 있습니다. 객체는 실제로 모든 프로세스가 그것을 사용하지 않을 때만 제거됩니다.

+0

감사합니다. 프로세스는/dev/shm/mem과 같은 파일을 생성하고 잘라 버릴 수 있습니다. 다른 프로세스는/dev/shm/mem을 열고 mmap 그것을 할 수 있습니다. 다음 fsync, msync에 대한 필요가 없을 것입니다 ..즉각적인 변경을 보장하기 위해? –

+0

@JackAndrews 아니요, fsync는 적용되지 않습니다. msync는 일반적인 mmap 파일의 변경 내용을 디스크에 플러시 *하는 데 사용됩니다. 프로세스가 MAP_SHARED를 사용하여 동일한 파일을 맵핑하면 프로세스 공간에서 정확히 동일한 공유 RAM 페이지를 공유하게됩니다. –

+0

공유 된지도 및 파일을 백업 해 주셔서 감사합니다. 나는 이식성에 관심이 없기 때문에/dev/shm /에서 파일을 열거 나 매핑하고 연결을 해제하는 것이 더 좋거나 나쁨 또는 동일할까요? [shm_open ..보다] –

관련 문제