3

1 台のマシンに、非常に高速で低遅延、高スループットのプロセス間 (またはアプリケーション ドメイン間) 通信を実装する必要があります。

メッセージは通常、数ミリ秒ごとに流れます (ただし、数分間のピークでは、1 ミリ秒あたり最大 3 ~ 5 のメッセージがある場合もあります)。メッセージを送信し、消費者がメッセージを「要求」したいかどうかを通知するために何らかの形でプロデューサーにコールバックします)。

私はいくつかの調査を行いましたが、メモリにマップされたファイルが利用可能な最速の可能性であるように見えますが、その周りの通信スタック全体を独自に実装する必要があります (共有メモリの割り当てと管理、そこへのメッセージのコピーとそこからのメッセージのコピー、および消費者への通知新しいメッセージを使用する準備ができています)。Windows での IPC メソッドのアーキテクチャを示す写真に出くわしました ( http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4 .aspx ) これらのメソッドは既に MMF を使用しているようです。つまり、私が説明したように、名前付きパイプが既に行っていることを再実装することで、実際に車輪を再発明するのではないでしょうか。または、名前付きパイプが提供できるものよりもはるかに高速なプロトコルを実際に実現できますか?

Edit1: 名前付きパイプが MMF の上に構築されていることを示す画像への frgotten リンクの追加 ( http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files- in-net-4.aspx )

4

1 に答える 1

6

はい、パイプは、カーネル メモリ プールに存在する共有メモリ上の抽象化です。メモリマップファイルは一番下にあり、共有メモリへの生のアクセスを提供しますが、それを正しく行うのに役立つものは何もありません。メモリへのアクセスと信号の変更を調停するのはあなた次第です。

あなたが引用しているメッセージレートは、パイプに追いつくのに苦労するほどではありません。一般的なオーバーヘッドは、約 1 マイクロ秒の一定の OS オーバーヘッドに、メモリ バスの帯域幅によって設定されるメッセージのコピーに必要な時間を加えたものです。DDR2 RAM を搭載した最も低い消費者向け PC で、少なくとも毎秒 5 ギガバイト。ローカル ループバックを使用するソケットのオーバーヘッドはまったく同じです。マネージド プログラムの MMF も同様です。ポインターを使用しない限り、データのコピーは避けられません。

于 2013-09-16T12:07:38.113 に答える