3

TCP/IPに代わる並列計算用のアクティブメッセージングプロトコルを開発しています。私の目標は、パケットの遅延を減らすことです。環境はLANであるため、TCP / IPをより単純なプロトコルに置き換えて、パケットの遅延を減らすことができます。私はデバイスドライバーを作成しておらず、TCP/IPスタックをより単純なものに置き換えようとしています。ここで、パケットのデータをユーザースペースからカーネルスペースに、またはその逆にコピーすることを避けたかったのです。mmap()について聞いた。これを行うための最良の方法ですか?はいの場合、いくつかの例へのリンクを提供できれば便利です。私はLinux初心者です、そして私は本当にあなたの助けに感謝します..ありがとう...

ありがとう、バラ

4

2 に答える 2

3

すでにかなり高速なUDPを使用する必要があります。少なくとも、W32/SQLSlammerがインターネット全体に広がるのに十分な速さでした。

最初の質問については、(vm)spliceおよびteeLinuxシステムコールを参照してください。

マンページから:

3つのシステムコールsplice(2)、vmsplice(2)、およびtee(2))は、パイプに使用されるのと同じタイプのバッファーを使用してカーネル内に実装された任意のカーネルバッファーを完全に制御できるユーザースペースプログラムを提供します。概要では、これらのシステムコールは次のタスクを実行します。

splice(2)

  moves data from the buffer to an arbitrary file descriptor, or vice

逆に、またはあるバッファから別のバッファに。

tee(2)

  "copies" the data from one buffer to another.

vmsplice(2)

  "copies" data from user space into the buffer.

コピーについて話しますが、実際のコピーは一般的に避けられます。カーネルは、カーネルメモリのページへの参照カウントポインタのセットとしてパイプバッファを実装することによってこれを行います。カーネルは、ページを参照する新しいポインター(出力バッファー用)を作成し、ページの参照数を増やすことによって、バッファー内にページの「コピー」を作成します。バッファーのページではなく、ポインターのみがコピーされます。

于 2010-05-04T00:52:23.687 に答える
0

環境はLANであるため、TCP / IPをより単純なプロトコルに置き換えて、パケットの遅延を減らすことができます

一般に、LAN UDPパケットでも失われる傾向がありますが、クライアントがそれを消費するのに十分な時間がない場合も失われます...

いいえ、TCPを他のもの(UDP)に置き換えないでください。信頼できる配信が必要な場合は、TCPが最速になるためです(確認応答と再送信に接続されるものはすべてカーネル空間で行われるため)。

通常、通常の場合、TCPを使用しても遅延の問題はありません(もちろんTCP_NODELAYオプションを忘れないでください)

記憶の共有について。実際、割り当てるメモリはすべてmmapで作成されます。したがって、カーネルは、ドライバからパケットを作成するときに、いずれにせよそれを何らかの方法でコピーする必要があります。

コピーの削減について話している場合、それは通常、ファイル/ソケットに対して行われ、 sendfile()カーネルとユーザーの間でデータをコピーすることを実際に防ぐために使用されます。ただし、ファイルを送信する必要はないと思います。

于 2010-05-04T04:38:02.460 に答える