Linuxでカーネル2.6を使用してネットワークデーモンを作成しています。このデーモンには、 1つのプロデューサープロセスとN個のコンシューマープロセスがあり、データに変更を加えず、プロデューサーへの応答を作成しません。
プロデューサープロセスは、長さが数10バイトから数10 Kバイトまで変化するデータオブジェクトを生成するときはいつでも、データオブジェクトを1つの使用可能なコンシューマープロセスに渡す必要があります。
初めて、名前付き/名前なしのパイプを使用することを検討しました。ただし、それらはメモリコピーのオーバーヘッドになります。
- プロデューサーのユーザースペースバッファー--copy->カーネルスペースPIPEバッファー
- カーネルスペースPIPEバッファー--copy->コンシューマーのユーザースペースバッファー
プログラムは待ち時間の短い多数のピアで動作する可能性があるため、コピーオーバーヘッドは有害である可能性があります。そのため、mmap()でPOSIX共有メモリを使用することにしました。
POSIX共有メモリをmmap()で使用してプロセス間でデータを共有しても、PIPEとは異なり、メモリコピーが発生しないのではないかと思っています。
また、プロセス間でデータを共有する他の方法はありますが、結果はゼロコピーになりますか?プログラムは、最新バージョンのカーネルを搭載したLinuxで実行され、クロスプラットフォーム機能を備えている必要はない場合があります。
コンシューマー/プロデュースごとにスレッドを生成/実行するのではなく、設計上の問題のためにプロセスを実行することにしました。
返信ありがとうございます。