2017-10-25 4 views
1

일반적으로 공유 메모리는 프로세스 주소 공간에 매핑되는 온 - 디스크 파일 부분을 사용하여 구현됩니다. 공유 영역에서 메모리 액세스가 발생할 때마다 파일 시스템은 디스크에 변경 사항을 기록하는 작업과 관련되어 큰 오버 헤드가 발생합니다.

일반적으로 fopen()을 호출하면 mmap()으로 전달되는 파일 설명자를 반환하여 파일의 메모리 맵을 만듭니다. 분명히 같은 방식으로 작동합니다. 정규 파일 작업에서도 사용할 수있는 파일 설명자를 반환합니다 (예 : ftruncate, ftell, fseek ... 등). 문자열을 shm_open에 대한 매개 변수로 지정하지만 fopen()과 달리 표시되는 파일 시스템 (탑재 된 HDD, 플래시 드라이브, SSD ...)의 실제 파일 이름이 아닙니다. 동일한 문자열 이름은 완전히 관련없는 프로세스가 동일한 영역을 주소 공간에 매핑하는 데 사용될 수 있습니다.

shm_open &에 전달 된 문자열 매개 변수는 무엇입니까? shm_open은 생성/열기가 무엇입니까? 그것은 임시 파일 시스템 (/ tmp)에 결국 많은 프로세스에서 공유 영역을 생성하는 데 사용되는 파일입니까 (음, 파일 디스크립터를 반환하기 때문에 어떤 종류의 파일이어야합니다)? 아니면 커널에 의해 뒷받침되는 신비하고 숨겨진 파일 시스템일까요?

사람들은 shm_open이 더 빠르다고 말하면 fopen이 디스크 작업이 필요 없기 때문에 커널은 보이지 않는 RAM 기반 파일 시스템을 사용하여 shm_open과 공유 메모리를 구현합니다.`shm_open`은 어떤 유형의 메모리 객체를 사용합니까?

+1

왜 공유 메모리가 디스크에 매핑되어 있다고 생각하십니까? linux shm_open의 –

+0

은 보통/dev/shm에'file '장치를 생성합니다. – bruceg

+0

Btw oracle은 공유 메모리를 사용하며 디스크에 저장되지 않습니다. –

답변

5

일반적으로 공유 메모리는 프로세스 주소 공간에 매핑 된 온 - 디스크 파일 부분을 사용하여 구현됩니다. 공유 영역에서 메모리 액세스가 발생할 때마다 파일 시스템은 디스크에 변경 사항을 기록하는 작업과 관련되어 큰 오버 헤드가 발생합니다.

오히려 예기치 않게 보입니다. IPC 의미에서 공유 메모리 영역을 구현하는 거의 모든 시스템은 기능을 지원하는 가상 메모리 단위를 가지고 있습니다. 특정 공유 메모리 세그먼트 또는 그 일부를 백업하는 영구 저장 장치가있을 수도 있고 없을 수도 있습니다. 페이징 된 부분 (있는 경우) 만 이러한 저장 장치에 의해 백업되어야합니다.

shm_open은 분명히 동일한 방식으로 작동합니다. 정규 파일 작업에서도 사용할 수있는 파일 설명자를 반환합니다 (예 : ftruncate, ftell, fseek ... 등). "shm_open()open()의 모델로 인터페이스를 가지고 있으며, 그것이 의미 특정 범용으로 사용할 수있는 파일 기술자를 반환의 I/O 기능, shm_open() 것을 의미하지는 않는

는 같은 방식으로 작동 "더 넓은 의미에서. 거의 모든 시스템 자원이 프로세스로 파일로 표시됩니다. 이것은 전체 시스템 인터페이스를 단순하게 해 주지만 동일한 기능을 통해 조작 될 수 있다는 사실을 넘어서서 실제 리소스의 공통성을 의미하지는 않습니다.

그럼, 문자열 매개 변수가 열립니다/shm_open를 생성 무엇 shm_open &에 전달됩니다?

매개 변수는 공유 메모리 세그먼트를 식별하는 문자열입니다. 당신은 이미 그것을 알고있었습니다, 그러나 당신은 그것보다 더 많은 것이 있다고 생각하는 것 같습니다. 최소한 shm_open 인터페이스가 지정된 수준 (POSIX)에는 없습니다. 식별자는 주로 커널에 의미가 있습니다. 다른 구현은 세부 사항을 다르게 처리합니다.

결국

이 될 수있는 공유 영역을 만드는 데 많은 프로세스에 의해 사용되는 그 어떤 임시 파일 시스템 (/ TMP)에있는 파일이지만, 아마 아니다. 제공된 파일 시스템 인터페이스는 실제 파일 시스템이 아닌 가상 파일 시스템이 될 가능성이 있습니다 (그러나 확실하지는 않음). 영구 저장 장치를 사용하면 시스템의 스왑 공간에서 제공 될 수 있습니다.

(음, 파일 설명자를 반환하기 때문에 어떤 종류의 파일이어야한다고 생각하십니까?)

이러한 결론은 부인할 수 없다. 소켓 및 파이프는 파일 설명자를 통해 표시되지만 해당 액세스 가능 파일은 없습니다.

아니면 커널에 의해 뒷받침되는 신비하고 숨겨진 파일 시스템일까요?

아마도 더 나은 개념이지만, 영구 저장 장치가 전혀 없을 수도 있습니다. 그러나 어느 정도까지는 시스템의 스왑 공간에 포함될 가능성이 있습니다.이 모든 것이 신비로운 것은 아닙니다.

4

일반적으로 공유 메모리는 프로세스 주소 공간에 매핑 된 온 - 디스크 파일 부분을 사용하여 구현됩니다.

적어도 최근의 Linux 배포판을 실행하는 데스크톱이나 랩톱에서는 적절한 RAM (예 : 8Gbytes 이상)을 사용하는 것이 일반적으로 잘못된 것입니다.

따라서 디스크는 적합하지 않습니다. 스왑없이 shm_open을 사용할 수 있습니다. shm_overview(7)을보고 /dev/shm/은 일반적으로 tmpfs 마운트 파일 시스템이므로 어떤 디스크도 사용하지 마십시오. tmpfs(5)을 참조하십시오. 그리고 tmpfs은 에서 작동하므로 thrashing 조건에 도달하지 않으면 디스크를 사용하지 않습니다.

파일 시스템이 디스크에 변경 사항을 기록하는 데 큰 부하가됩니다.

대개 잘못되었습니다. 대부분의 시스템에서 최근에 작성된 파일은 디스크에 빨리 도달하지 않는 page cache에 있습니다 (BTW, 그 이유는 종료 절차가 거의 사용되지 않는 sync(2)을 호출해야하는 이유입니다).

사실 대부분의 데스크톱과 랩톱에서 관찰하기 쉽습니다. 하드 디스크에 일부 LED가 있으며 shm_open 및 관련 전화를 사용할 때 깜박이지 않습니다. BTW, proc(5) (특히 /proc/diskstats 등 ....)을 사용하여 커널에 디스크 활동에 대해 쿼리 할 수 ​​있습니다.

+0

이제는 의미가 있습니다. 그래서'shm_open'에 전달 된 매개 변수는/dev/shm /'tempfs' 파일 시스템의 파일 이름입니까? –

+1

예, [shm_overview (7)] (http://man7.org/linux/man-pages/man7/shm_overview.7.html)에 설명되어 있습니다. SO 또는 다른 곳에서 질문하기 전에 문서와'man' 페이지를 읽어야합니다. –

관련 문제