3

UNIX プロセス間で適度に大量のデータ (ギガバイトではなく数メガバイト) を交換する最良の方法は何ですか?

サイズの制限は十分に許容できるように見えるため、メモリマップファイルになると思います。

双方向通信が必要なので、共通のパイプは役に立ちません。また、ソケットと UDP には、私の知る限り、サイズ制限があります (こちらも参照してください)。の子プロセスと親プロセスの間で通信するのに TCP を使用することをお勧めしますfork()

このような関連する質問を読むと、共有メモリ/mmap を推奨する人もいれば、ソケットを推奨する人もいます。

他に調べる必要があるものはありますか?たとえば、データの XML シリアライゼーション/デシリアライゼーションなどを提供することで IPC を支援する高レベルのライブラリはありますか?

コメントによる編集:

私の特別なケースでは、親/コントローラー プロセスといくつかの子 (スレッドを使用できません) があります。コントローラーは、リクエストに応じて、おそらく 1 つの UDP パッケージに収まるいくつかの重要なデータを子に提供します。子プロセスはキー データに基づいて動作し、キーに基づく情報をコントローラーに提供します (情報のサイズは 10 ~ 100MB の場合があります)。

問題: 応答データのサイズ、キーの要求を親に通知するメカニズム、同期 - 親は子に渡した後にキーをリストから削除する必要があり、キーの重複処理は発生しません。

Boost やその他のサードパーティ ライブラリは (残念ながら) 使用しないでください。SunOS 5.10 システムが提供するライブラリを使用できる可能性があります。

4

3 に答える 3

4

ソケット。並列実行を安全にするために、ロックなどを使用して書き込みまたは読み取り中にメモリを保護する必要はありません。追加の利点は、ネットワーク通信にもソケット通信コードを使用して、コードを 2 つの個別の実行可能ファイルに非常に簡単に分割し、これらを異なるマシンで実行できることです。

私の目には、主な欠点は、データを (逆) シリアル化し、データ チャンクを複数のパケットに分割/組み立てるスキームを見つける必要があることです。

于 2013-07-04T05:43:49.857 に答える
2

共有メモリ。読み取り/書き込みが非常に高速で、常に両側で利用でき、要求への応答は必要ありません。

http://en.wikipedia.org/wiki/Shared_memory

さらに重要なことは、データセットのコピーを 1 つだけ保持すればよいため、最終的に 2 つのコピーと転送中のデータが発生することはありません。また、2 つのコピーを購入する余裕がない場合は、同じデータをストリーミングする必要がある可能性があります。他のソリューションで複数回。

于 2013-07-04T05:39:46.743 に答える