2009-07-14 142 views
9

IPCを使用して、子プロセスからOS X 10.4以降の親プロセスに大量のデータ(200kb +)を渡す必要があるため、Unix上の共有メモリ、特にSystem VとPOSIX共有メモリのメカニズムを読み上げます。それで、mmap()がMAP_ANONとMAP_SHAREDフラグを使って同様のことをすることができることに気付きました(あるいは、通常のファイルが作成されても気にしない場合はMAP_SHAREDフラグを指定するだけです)。SysVまたはPOSIX共有メモリとmmap()を使う理由は何ですか?

私の質問は、mmap()を使用しない理由がありますか?はるかに簡単ですが、メモリはまだ共有されており、MAP_ANONを使用すると実際のファイルを作成する必要はありません。親プロセスでファイルを作成し、fork()とexec()を子プロセスで使用することができます。

第二の問題は、このアプローチが十分ではなく、SysVまたはPOSIX共有メモリメカニズムを使用する必要がある理由は何か。

私は、他の通信に必要なパイプを使用して同期を行うことを計画していました。つまり、親はパイプ上のデータを要求し、子はそれを共有メモリに書き込み、その準備ができたパイプで応答します。複数の読者またはライターは関与していません。移植性は優先事項ではありません。

答えて

8

親/子関係がある場合は、mmapを使用すると問題はありません。

sysv_shmは、関連するプロセスや無関係なプロセスがメモリを共有できるようにする元のUNIXの実装です。 posix_shmは共有メモリを標準化しました。

mmapなしでposixシステムを使用している場合は、posix_shmを使用します。あなたがposix_shmなしでUNIX上にいる場合は、sysv_shmを使用します。メモリと親/子を共有する必要がある場合は、利用可能な場合はmmapを使用します。

+0

mmapなしでposix_shmを使用することはできません。その部分はナンセンスです。しかし、最初の段落で正しいですが、親/子関係がないときにposix_shmがmmapを有効にします。 –

0

メモリが提供されている場合、mmap以上のSysV/POSIXを使用する唯一の理由は移植性です。特に古いUnixシステムではMAP_ANONをサポートしていません。 Solaris、Linux、BSD、OS X ですが、実際にはmmapを使用しない理由はほとんどありません。

1

Linuxでのshmは通常mmap PEDを取得し/dev/shmファイルを経由して実装されているので、パフォーマンスは同等でなければなりません - 私は移植性を知っていれば、私は、簡単にするために(あなたが言及としてMAP_ANON/WとMAP_SHAREDmmapでいいよあなたの言う通り、問題はありません。

0

限りdocumentationが知っているとして、あなた必要がありますがXlib/XCB共有メモリの画像を使用したい場合は使用SYSV共有メモリ。

関連する問題