GNU/Linux >> Linux の 問題 >  >> Linux

Linux共有メモリ:shmget()とmmap()?

この多くは、歴史と将来の方向性に関係しています。

むかしむかし、unix には 2 つの主要な (そしてやや競合する) バージョン、つまりシステム V と BSD がありました。 SysV には、ビッグ 3 (共有メモリ、セマフォ、およびメッセージ キュー) を含む独自のバージョンの IPC がありました。 POSIX は物事を統合するために登場しました。

したがって、現在のところ、posix 共有メモリ、MQ、およびセマフォと sysV バージョンの 2 つのバージョンがあります。もう少し混乱させるために、sysV のバージョンも posix の一部です。

基本的にあなたの質問は、Posix または sysV スタイルの共有メモリを使用したいですか?一般に、ほとんどの人は長期的な視点から Posix を選択します。しかし、現実的には、sysV は非常に多くのシステムに組み込まれているため、それが消えることはないのではないかと真剣に疑う必要があります。

したがって、長期的なものを排除することは、あなたのプロジェクトとあなたの好みにとって何が理にかなっているのかということになります.一般に、sysV バージョンは実際にはいくらか強力になる傾向がありますが、最初の接触でほとんどの人が少し戸惑うと感じるぎこちないインターフェイスを備えています。これは、特に sysV セマフォとメッセージ キューに当てはまります。共有メモリに関しては、sysV と posix の両方が厄介であると主張できます。 sysV バージョンには不格好な ftok が含まれています posixが複数の呼び出しといくつかの競合状態を設定することになる間、重要なもの。外部から見ると、posix バージョンには、ファイル システムを利用し、別のユーティリティ プログラム (例:ipcs ) sysV が必要とします。

では、どちらを使用する必要がありますか?原則として、posix バージョン。しかし、sysV のバージョンについてよく理解しておく必要があります。これらには、特定の状況で利用したい場合がある posix バージョンの機能を超える機能がいくつかあります。


どちらの方法も実行可能です。 mmap メソッドは shmget よりも少し制限的です 、しかし使いやすい。 shmget は古い System V 共有メモリ モデルであり、最も広くサポートされています。 mmap /shm_open 共有メモリを行うための新しい POSIX の方法であり、より使いやすくなっています。 OS で POSIX 共有メモリの使用が許可されている場合は、それを使用することをお勧めします。

いくつかのヒント:

  • fork で子を作成する場合 次に mmap MAP_ANONYMOUS | MAP_SHARED で 1 回の呼び出しで、はるかに簡単な方法です。 MAP_ANONYMOUS ただし、POSIX で指定されていない Linux 拡張機能です。
  • プロセスを個別に開始するが、共有メモリ名を指定できる場合は shm_open (+ ftruncate ) + mmap MAP_SHARED で 2/3 コールです。 librt が必要です 一部の OS では。
  • お使いの OS が /dev/shm/ の場合 次に shm_open /dev/shm/ でファイルを開くのと同じです .

Linux
  1. Linuxのメモリ使用量

  2. Linuxでメモリキャッシュをクリアする方法

  3. Linux –実際のメモリ使用量?

  1. PosixプログラマーマニュアルとLinuxプログラマーマニュアル?

  2. Linux メモリ管理 – スワッピング、キャッシュ、および共有 VM

  3. Linux での ipcs コマンドの例

  1. Linux で共有ライブラリを初期化する方法

  2. プロセス間通信の推奨事項

  3. Linux 共有ライブラリのストリッピング