2014-07-21 2 views
11

다음과 같은 이점이 있습니다. shm_openmmap?
일반 파일을 생성 한 다음 fdmmap에 전달하면 어떨까요?
shm_open의 장점을 볼 수 없습니다. 단지 참고서 일뿐입니다.왜 shm_open을 사용합니까?

나는 온 가족의 남자를 읽었습니다. 그것은 "비밀"이 mmaping 동작에있는 것 같습니다. 파일 "type"은 의미가없는 것처럼 보입니다.

특히 성능 계정에서 어떤 포인터가 좋을 것입니다.
내 컨텍스트는 끊임없이 하나의 프로세스로 작성되고 다른 프로세스에서 지속적으로 덤프되는 (반복적 인 쓰기 가능한) 버퍼 (예 : 128MB)입니다.

예 : this open/mmap 방식의 문제점.

편집
가 정확하려면, 중 하나입니다 다른 것보다 더 나은 다음
fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR); mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
나는 /dev/shm FS에서 일반 open을 가진 파일을 생성하고, 버려진 fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR); mem = mmap(...same as before...);
쓰레기를 가져다 쓰면 사용 가능한 메모리가 1G로 내려 갔고 사용 가능한 디스크 공간은 동일하게 유지되었습니다.
두 가지 방법의 차이점은 무엇입니까?

+0

시도해보십시오. 파일에 쓰는 것은 아마도 100 배 더 느릴 것입니다. –

답변

12

일반 파일을 열고 mmap()하면 해당 파일에 데이터가 저장됩니다.

여분의 I/O 오버 헤드가 발생하는 데이터를 유지할 필요없이 메모리 영역을 공유하기 만하면 shm_open()을 사용하십시오.

이러한 메모리 영역을 사용하면 뮤텍스 나 세마포어와 같은 다른 종류의 개체를 저장할 수 있습니다.이 개체는 대부분의 시스템에서 mmap()의 일반 파일에 저장할 수 없습니다.

+0

그러나/dev/shm fs 아래에 파일을 만든 경우 어떻게해야합니까? open ("/ dev/shm/myshm", "w")? shm_open을 사용하면 어떤 이점이 있습니까? – Trevor

+2

그러면 shm_open을 사용하거나 open을 사용하면 거의 동일하게 보일 것입니다. 표준 접근법이 존재할 때 오히려 맹렬한 태도를 취할 것입니다. shm_open은 비표준 위치에 마운트 된 경우/dev/shm을 찾는데주의를 기울입니다. – nos

+0

이식성 문제를 지적 해 주셔서 감사합니다. VM은 고객에게 VM으로 제공되므로 코드가 실행되는 배포를 제어하므로이를 관리 할 수 ​​있습니다.처음에 나에게있어 무엇이/dev/shm fs 아래에 논리적 인 디렉토리를 만들지 않는 것이었다. 이것은 glibc의 shm_open의 유물이며 fs의 문제는 아닙니다. 그래서 open()으로 갈 것입니다. – Trevor

2

두 호출 모두 현대 리눅스에서 본질적으로 같습니다. - 첫 번째 방법은 POSIX 공유 메모리를 기본적으로 사용할 수없는 go (https://github.com/fabiokung/shm/blob/master/shm_linux.go 참조)와 같은 언어에서 POSIX 공유 메모리에 액세스하는 데 사용할 수 있습니다. 다른 OS/버전에서는 다를 수 있습니다. 첫 번째 호출은 파일 생성 또는/dev/shm을 사용할 수 없거나 성능이 저하 될 수 있습니다. 경로 병합 규칙도

2라는 POSIX 공유 메모리 API를 ((표준 libs와 지원)

첫번째 방법이라고 메모리 API 파일을 매핑

librt의 버전으로 버전에서 진화 할 수있는 필요 librt 일명 libposix 의존 리눅스에 내부적으로 경로를 만들고 통화를 엽니 다.)