web-dev-qa-db-ja.com

shm_openを使用する理由

行う利点は何ですか:shm_openmmapをフォローしましたか?
通常のファイルを作成してから、fdmmapに渡さないのはなぜですか?
shm_openの利点がわかりません。これらは単なる参考に過ぎませんか?

私は家族全員の男を読みました。 「秘密」は攻撃行為にあるように私には思えます-ファイルの「タイプ」は無意味なようです。

特にパフォーマンスアカウントに関しては、どのポインタも良いでしょう。
私のコンテキストは、1つのプロセスとして常に書き込まれ、別のプロセスによって常にダンプされる(周期的な上書き可能な)バッファ(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);

vs.

fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);

/dev/shm fsの下に通常のopenを使用してファイルを作成し、1ギガのゴミをダンプしたところ、使用可能なメモリが1G減少し、使用可能なディスク領域は同じままでした。
2つの方法の違いは何ですか?

20
Trevor

通常のファイルを開いてmmap()すると、データは最終的にそのファイルに格納されます。

メモリ領域を共有する必要があるだけで、データを永続化する必要がなく、余分なI/Oオーバーヘッドが発生する場合は、shm_open()を使用します。

このようなメモリ領域を使用すると、ミューテックスやセマフォなどの他の種類のオブジェクトを格納することもできます。これらのオブジェクトは、ほとんどのシステムでmmap()された通常のファイルに格納できません。

19
nos

両方の呼び出しは、現代のLinuxでは基本的に同等です-最初のアプローチは、goなどの言語からPOSIX共有メモリにアクセスするために使用できます( https://github.com/fabiokung/shm/blob/master/shm_linux.goを参照 =)POSIX共有メモリがネイティブで利用できない場合-最初の呼び出しが一部のファイルの作成または/ dev/shmが利用できないか、パフォーマンスが低下する可能性がある他のOS /バージョンでは異なる場合があります。パスのマージのルールもlibrtのバージョンごとに進化している可能性があります

メモリマップファイルAPIと呼ばれる最初のアプローチ(標準ライブラリでサポート)

2番目に呼び出されたPOSIX共有メモリAPI(依存関係としてLinuxではlibrt別名libposixが必要です内部的にパスを構築し、openを呼び出します)

2
Maxim Sinev