web-dev-qa-db-ja.com

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

this threadでは、OPはmmap()の代わりにshmget()を使用してLinuxで共有メモリを取得することをお勧めします。 this pageおよび this pageにアクセスしてドキュメントを取得しましたが、2番目のドキュメントではmmap()に関するわかりにくい例が示されています。

ほとんど初心者であり、2つのプロセス間で(テキスト形式で)情報を共有する必要がある場合、shmget()メソッドまたはmmap()を使用する必要がありますか?なぜ?

55
BowPark

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

いくつかのヒント:

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

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

むかしむかし、unixには2つの主要な(やや競合する)バージョンがありました-システムVとBSDです。 SysVには、共有メモリ、セマフォ、メッセージキューという3つの大きなIPCが含まれていました。 POSIXは、物事を統一しようとやって来ました。

そのため、現時点では、posix共有メモリ、MQ、セマフォ、およびsysVバージョンの2つのバージョンがあります。物事を混乱させるために、sysVバージョンはalso posixの一部です。

基本的にあなたの質問は、PosixまたはsysVスタイルの共有メモリを使用したいですか?一般に、ほとんどの人は長期的な見方をしており、Posixを選択します。これは、将来への道のようです。しかし、現実的には、sysVの要素は非常に多くのシステムに非常に組み込まれているため、深刻な疑念を抱かなければならないのです。

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

それで、あなたはどちらを使うべきですか?原則として、posixバージョン。しかし、sysVのバージョンに本当に慣れる必要があります。これらには、特定の状況で利用したいPOSIXバージョンの機能を超える機能があります。

35
Duck