11

2つ以上のソケット間でゼロコピーデータ転送を実行する優れたJavaライブラリ/ APIパッケージを知っている人はいますか? Java の NIO API は、それぞれ java.nio.channels.FileChannel.transferTo メソッドと java.nio.channels.FileChannel.transferFrom メソッドを使用して、ディスクからソケットへ、またはその逆にゼロ コピー データ転送を実行できることを知っています。ただし、Java ソケットからソケットへのゼロ コピー転送はサポートされていないようです。さらに、システム コール スプライス (ファイル記述子からパイプへ、またはその逆にデータを転送できる) を実行できる Java ライブラリ/API は、できれば Linux プラットフォームでプラスになります。

返信ありがとうございます。

さらに、以前のゼロ コピーに関するブログや、 http://www.ibm.com/developerworks/library/j-zerocopy/などの他の有益なサイトのほとんどを読みました。ただし、上記の問題は解決されていないようです。

4

1 に答える 1

-1

私は SocketChannel についてあまり知りませんがByteBuffer.allocateDirect()、あなたにとっては良い選択だと思います。

ソケット A のデータをByteBuffer.allocateDirect()読み込んで、ソケット B に簡単に読み込めるようにするだけです。

違いは次のとおりです。

1.オールドウェイ

SocketA --> BufferA(カーネル空間) --> BufferB(ユーザー空間)

BufferB(ユーザー空間) --> BufferC(カーネル空間) --> SocketB

2. ゼロコピー方式

SocketA --> DirectBuffer (カーネルとユーザー空間からアクセス可能)

DirectBuffer --> SocketB

ノート

私見、直接作成できるとは思いません.OSはSocketA -> SocketBデータを送信する前にデータを物理メモリにロードする必要があります。

=========編集=========

あなたが参照した記事によると、FileChannel の transferTo は次のように実行します。

ここに画像の説明を入力

カーネルとユーザー空間の間でコンテキストをByteBuffer.allocateDirect()切り替える必要はありません。読み取りと送信で同じブロックを使用する間、唯一のバッファが物理メモリにマップされます。

于 2014-01-03T05:54:49.197 に答える