일반적으로 공유 메모리는 프로세스 주소 공간에 매핑되는 온 - 디스크 파일 부분을 사용하여 구현됩니다. 공유 영역에서 메모리 액세스가 발생할 때마다 파일 시스템은 디스크에 변경 사항을 기록하는 작업과 관련되어 큰 오버 헤드가 발생합니다.
일반적으로 fopen()
을 호출하면 mmap()
으로 전달되는 파일 설명자를 반환하여 파일의 메모리 맵을 만듭니다. 분명히 같은 방식으로 작동합니다. 정규 파일 작업에서도 사용할 수있는 파일 설명자를 반환합니다 (예 : ftruncate
, ftell
, fseek
... 등). 문자열을 shm_open
에 대한 매개 변수로 지정하지만 fopen()
과 달리 표시되는 파일 시스템 (탑재 된 HDD, 플래시 드라이브, SSD ...)의 실제 파일 이름이 아닙니다. 동일한 문자열 이름은 완전히 관련없는 프로세스가 동일한 영역을 주소 공간에 매핑하는 데 사용될 수 있습니다.
shm_open
&에 전달 된 문자열 매개 변수는 무엇입니까? shm_open
은 생성/열기가 무엇입니까? 그것은 임시 파일 시스템 (/ tmp)에 결국 많은 프로세스에서 공유 영역을 생성하는 데 사용되는 파일입니까 (음, 파일 디스크립터를 반환하기 때문에 어떤 종류의 파일이어야합니다)? 아니면 커널에 의해 뒷받침되는 신비하고 숨겨진 파일 시스템일까요?
사람들은 shm_open
이 더 빠르다고 말하면 fopen
이 디스크 작업이 필요 없기 때문에 커널은 보이지 않는 RAM 기반 파일 시스템을 사용하여 shm_open
과 공유 메모리를 구현합니다.`shm_open`은 어떤 유형의 메모리 객체를 사용합니까?
답변
일반적으로 공유 메모리는 프로세스 주소 공간에 매핑 된 온 - 디스크 파일 부분을 사용하여 구현됩니다. 공유 영역에서 메모리 액세스가 발생할 때마다 파일 시스템은 디스크에 변경 사항을 기록하는 작업과 관련되어 큰 오버 헤드가 발생합니다.
오히려 예기치 않게 보입니다. IPC 의미에서 공유 메모리 영역을 구현하는 거의 모든 시스템은 기능을 지원하는 가상 메모리 단위를 가지고 있습니다. 특정 공유 메모리 세그먼트 또는 그 일부를 백업하는 영구 저장 장치가있을 수도 있고 없을 수도 있습니다. 페이징 된 부분 (있는 경우) 만 이러한 저장 장치에 의해 백업되어야합니다.
shm_open
은 분명히 동일한 방식으로 작동합니다. 정규 파일 작업에서도 사용할 수있는 파일 설명자를 반환합니다 (예 :ftruncate
,ftell
,fseek
... 등). "shm_open()
이open()
의 모델로 인터페이스를 가지고 있으며, 그것이 의미 특정 범용으로 사용할 수있는 파일 기술자를 반환의 I/O 기능,shm_open()
것을 의미하지는 않는
는 같은 방식으로 작동 "더 넓은 의미에서. 거의 모든 시스템 자원이 프로세스로 파일로 표시됩니다. 이것은 전체 시스템 인터페이스를 단순하게 해 주지만 동일한 기능을 통해 조작 될 수 있다는 사실을 넘어서서 실제 리소스의 공통성을 의미하지는 않습니다.
그럼, 문자열 매개 변수가 열립니다/
shm_open
를 생성 무엇shm_open
&에 전달됩니다?
매개 변수는 공유 메모리 세그먼트를 식별하는 문자열입니다. 당신은 이미 그것을 알고있었습니다, 그러나 당신은 그것보다 더 많은 것이 있다고 생각하는 것 같습니다. 최소한 shm_open
인터페이스가 지정된 수준 (POSIX)에는 없습니다. 식별자는 주로 커널에 의미가 있습니다. 다른 구현은 세부 사항을 다르게 처리합니다.
결국
이 될 수있는 공유 영역을 만드는 데 많은 프로세스에 의해 사용되는 그 어떤 임시 파일 시스템 (/ TMP)에있는 파일이지만, 아마 아니다. 제공된 파일 시스템 인터페이스는 실제 파일 시스템이 아닌 가상 파일 시스템이 될 가능성이 있습니다 (그러나 확실하지는 않음). 영구 저장 장치를 사용하면 시스템의 스왑 공간에서 제공 될 수 있습니다.
(음, 파일 설명자를 반환하기 때문에 어떤 종류의 파일이어야한다고 생각하십니까?)
이러한 결론은 부인할 수 없다. 소켓 및 파이프는 파일 설명자를 통해 표시되지만 해당 액세스 가능 파일은 없습니다.
아니면 커널에 의해 뒷받침되는 신비하고 숨겨진 파일 시스템일까요?
아마도 더 나은 개념이지만, 영구 저장 장치가 전혀 없을 수도 있습니다. 그러나 어느 정도까지는 시스템의 스왑 공간에 포함될 가능성이 있습니다.이 모든 것이 신비로운 것은 아닙니다.
일반적으로 공유 메모리는 프로세스 주소 공간에 매핑 된 온 - 디스크 파일 부분을 사용하여 구현됩니다.
적어도 최근의 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
등 ....)을 사용하여 커널에 디스크 활동에 대해 쿼리 할 수 있습니다.
이제는 의미가 있습니다. 그래서'shm_open'에 전달 된 매개 변수는/dev/shm /'tempfs' 파일 시스템의 파일 이름입니까? –
예, [shm_overview (7)] (http://man7.org/linux/man-pages/man7/shm_overview.7.html)에 설명되어 있습니다. SO 또는 다른 곳에서 질문하기 전에 문서와'man' 페이지를 읽어야합니다. –
- 1. 어떤 유형의 데이터베이스가 사용합니까?
- 2. Reddit에서 어떤 유형의 ORM을 사용합니까?
- 3. setlocale()은 어떤 파일을 사용합니까?
- 4. 어떤 유형의 리소스 파일을 상수 저장에 사용합니까?
- 5. ast 모듈은 어떤 유형의 트리 순회를 사용합니까?
- 6. 정기적으로 어떤 유형의 디자인 패턴을 사용합니까?
- 7. OpenGL은 어떤 유형의 픽셀 보간을 사용합니까?
- 8. 이 사이트에서 어떤 유형의 타이머를 사용합니까?
- 9. YouTube는 동영상에 어떤 유형의 ID를 사용합니까?
- 10. Backbone은 내부 용으로 어떤 유형의 이벤트를 사용합니까?
- 11. 어떤 유형의 PHP 데이터 유형을 사용합니까?
- 12. python에서 "request.args.get"은 어떤 유형의 변수를 반환합니까?
- 13. 어떤 유형의 객체를 문자열로 변환하는 방법
- 14. 로깅 필터는 어떤 유형의 객체를 조작합니까?
- 15. std :: string.c_str()은 어떤 인코딩을 사용합니까?
- 16. [ ""] 유형의 객체를
- 17. 파일은 어떤 스트림을 사용합니까?
- 18. C에서 동적 유형의 메모리 사용 #
- 19. shm_open 및 ftruncate 경쟁 조건이 가능합니까? <code>shm_open</code> 사람 페이지에서
- 20. 1 유형의 객체를 다른 유형의 객체로 전송
- 21. 어떤 유형의 암호화를 사용해야합니까?
- 22. 각도 구성 요소에 어떤 유형의 접두사 선택기 규칙을 사용합니까?
- 23. Solaris에서 공유 메모리 객체를 이름으로 나열합니다.
- 24. mblen()은 어떻게 사용합니까?
- 25. istream_iterator 객체를 다시 사용합니까?
- 26. SQL Compact의 "엔진 기본값"은 어떤 유형의 암호화입니까?
- 27. OSM을 통해 어떤 유형의 객체를 찾을 수 있습니까?
- 28. 팩토리는 어떤 유형의 객체를 만들지 어떻게 알 수 있습니까?
- 29. petapoco에 대한 가져 오기에서 어떤 유형의 객체를 사용할 수 있습니까?
- 30. UIViewController 사이를 전환 할 때 어떤 유형의 메모리 문제가 발생합니까?
왜 공유 메모리가 디스크에 매핑되어 있다고 생각하십니까? linux shm_open의 –
은 보통/dev/shm에'file '장치를 생성합니다. – bruceg
Btw oracle은 공유 메모리를 사용하며 디스크에 저장되지 않습니다. –