6

モノリシックな Windows プログラムを、ある種のプロセス間通信(IPC) を使用して相互に通信できる再利用可能なコンポーネントに分割し、何らかの理由で匿名パイプを選択するとします (たとえば、多数のプロセスとConsole.Out を次のプロセスの Console.In に接続するか、コマンド プロンプトで "|" を使用するだけです)。

名前付きパイプの例を含む Dr. Dobbs の記事:

同じマシン内の他の IPC メソッドと比較して、パフォーマンスはどの程度低下しますか? また、プロセスの数や送信されるデータの量をスケールアップするときに、最初に直面する問題は何でしょうか?

たとえば、パイプの代わりにファイルを使用していた場合、ロックの問題とディスク速度が発生します。

送信されるデータ構造をシリアル化する必要があるため、既にオーバーヘッドが発生していることに注意してください。これは、私の効率低下のベースラインです。

PS。パイプへの関心は、パイプが各プロセス (Console.Readline、Console.WriteLine) に簡単に実装できること、パイプに MSMQ および非同期 HTTP インターフェイスを簡単に記述できること、そして Unix とコマンド ラインが好きであることです。

4

1 に答える 1

14

CreatePipe() Win32 API 呼び出しを使用して双方向の匿名パイプを作成できるため、入出力のパイピングだけが方法ではありません。他のプロセスに与えることができる新しいファイルハンドルを取得するだけです。

匿名パイプは共有メモリに基づいていますが、(ReadFileEx、ReadFileWrite による) 非同期操作はサポートしていません。したがって、パフォーマンスの問題 (欠点) は、1) 同期操作、2) メモリのコピー、3) プロセス間同期です。一般に、「生の」共有メモリ (実際のバッキング ファイルのないメモリ マップ ファイル) と名前付きパイプは高速で、ソケットとウィンドウ メッセージは (匿名パイプより) 低速です。

匿名パイプで I/O Completion Ports (IOCP) を使用することはできません。代わりに、パイプを「ポーリング」する必要があり、余分なコンテキスト スイッチが発生します。データをシリアル化するだけでなく、共有メモリに直接書き込むことができないため、シリアル化されたデータをメモリ内にコピーする必要があります。1 つのプロセスも別のプロセスを待機する必要があります。これは、他のプロセスがプロセス間同期プリミティブを通知する必要があることを意味します。パフォーマンスは、メッセージのサイズ (送信されたデータ量に対する読み取り/書き込み呼び出しの比率) に大きく依存します。これは、読み取り/書き込みごとに、プロセスがコンテキスト スイッチを作成し、場合によってはスピン/スリープする必要があるためです。

「生の」共有メモリを除くすべてのメソッドは、メモリのコピーとある種のプロセス間シグナル伝達 (同期) を必要とするため、匿名パイプの主な欠点は同期操作です。CPU がほとんどの時間をコンテキスト スイッチの実行に費やしている場合、大量のメッセージを送信すると上限に達します。

IOCP を使用して非同期通知を処理するワーカー スレッドを持つことができ、1 回の呼び出しで複数のメッセージを受信することもできるため、パフォーマンスの面では名前付きパイプの方が優れているため、API のオーバーヘッドが削減されます。独自のコンポーネントを作成する場合は、パイプに名前を付けるという余分な問題が発生するだけの価値があります (さらに、ネットワークを介して接続することもできます)。それ以降の Windows バージョンでは、IOCP もサポートするローカル ソケット用の特別なルーティングが実装されています。

最も速い方法は、共有メモリを直接使用することですが、プロセス間の同期を自分で処理する必要があります。ロックフリー パイプを自分で実装することは可能ですが、常にデータを送信していない場合でも、同期プリミティブを使用してリッスン プロセスに通知/起動する必要があります。

また、ファイルを使用しても、ディスク速度によって制限されるわけではないことに注意してください。メモリ マップされたファイルを使用でき、通常のファイルでもキャッシュ マネージャーが読み取り/書き込みを処理します。他のメソッド (RPC、クリップボードなど) は、これらの「標準」メソッドに基づいています。つまり、プロトコルのレイヤーを追加するだけで、プログラミング環境により簡単に/より便利に、またはより適したものになることを意味します (ただし、速くなりません)。

于 2013-02-08T17:18:57.217 に答える