10

OS X 10.4以降では、IPCを使用して子プロセスから親プロセスに大量のデータ(200kb以上)を渡す必要があるため、Unixの共有メモリ、特にSystemVとPOSIXの共有メモリメカニズムを調べました。次に、mmap()をMAP_ANONフラグとMAP_SHAREDフラグとともに使用して、同様のことを実行できることに気付きました(または、通常のファイルが作成されてもかまわない場合は、MAP_SHAREDフラグと一緒に使用できます)。

私の質問は、mmap()だけを使用しない理由はありますか?はるかに単純なようで、メモリは引き続き共有され、MAP_ANONを使用する場合は実際のファイルを作成する必要はありません。親プロセスでファイルを作成してから、子プロセスでfork()およびexec()を実行し、それを子プロセスで使用できます。

質問の2番目の部分は、このアプローチでは不十分であり、SysVまたはPOSIX共有メモリメカニズムを使用する必要がある理由は何でしょうか。

Note that I was planning on doing synchronization using pipes that I need for other communication, i.e. the parent asks for data over the pipe, the child writes it to shared memory, and responds over the pipe that its ready. No multiple readers or writers involved. Portability is not a priority.

4

4 に答える 4

8

親子関係がある場合は、mmapを使用しても問題ありません。

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

mmapのないposixシステムを使用している場合は、posix_shmを使用します。posix_shmのないUNIXを使用している場合は、sysv_shmを使用します。親/子に対してメモリを共有するだけでよい場合は、可能な場合はmmapを使用します。

于 2009-07-14T20:35:47.560 に答える
1

メモリが機能する場合、SysV/POSIX を使用する唯一の理由mmapは移植性です。特に古い Unix システムでは、MAP_ANON. ただし、 Solaris、Linux、BSD、および OS Xを使用するため、実際には を使用しない理由はほとんどありませんmmap

于 2009-07-14T05:03:13.740 に答える
1

shmLinuxでは通常、 ped/dev/shmを取得するファイルを介して実装さmmapれるため、パフォーマンスは同等である必要があります-あなたが言うように移植性が問題にならないことがわかっている場合は、簡単にするためにmmap(w /MAP_ANONおよびあなたが言及したように)使用しますMAP_SHARED.

于 2009-07-14T05:03:21.743 に答える