私の理解を例を挙げて説明したいと思います。4 バイトのバッファーstream
を持つ抽象バッファー ネットワーク ストリームとします。バイトからバイトへの書き込みプロセスがあるとします (FIFO のように描画されます)。
write->| | | | |----->net
----->net
操作が非常に遅いため、数量を最小限に抑えたいと考えています。ここでバッファが役立ちます。
write->| 1 | | | |----->net
write->| 5 | 1 | | |----->net
write->| 12 | 5 | 1 | |----->net
write->| 7 | 12 | 5 | 1 |----->net
ここで、またはその少し前に、.NET 仮想マシンまたはオペレーティング システムが、書き込み操作を完了することを決定し、データをフラッシュします。
write->| | | | |----->net 7 12 5 1->
したがって、write->
操作は非常に高速になり、少なくともストリームが閉じている間の遅延の後、データはリモート ホストに送信されます。
コードでは、次のようになります。
using(networkStream)
for(var i = 0; i < 4; i++)
networkStream.WriteByte(getNextByte());
私は正しいですか?操作がスレッドに遅れる場合getNextByte
、データが密かに (非同期に) ストリームに渡され、すべてのコードに遅れが生じないことを期待できますか? WriteByte
それとも、めったに4倍遅れますか?データを渡す循環バッファを実装し、バッファからデータを読み取ってネットワークストリームにデータを渡す追加のスレッドを起動していませんか?
また、バッファリングされたネットワークストリームがデータ受信の速度を向上させることを大いに期待しています.
read<-| | 1 | 5 | 12 |<-----net <-7
using(networkStream)
while((b = networkStream.ReadByte()) >= 0)
process(b);
バッファリングされたネットワークストリームからバイトを同期的に取得して処理する場合、ストリーム バッファへのデータが networkStream によって密かに (非同期的に) 送信され、すべてのコードが遅延しないと期待できますか? ReadByte
それとも、めったに4倍遅れますか?
NetworkStream
PS標準ストリームがバッファリングされていることは知っています。
私の具体的なケースについて教えてください。ストリームのストライピングを実現する必要があります。リモートクライアントからストリームからデータを読み取り、それをリモートサーバーへの複数のストリームに渡したいのですが、このように交互に(フォークと呼ばれます)(画像a)
var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
outStreams[i].Write(buf, 0, c);
i = (i + 1) % outStreams.Length;
}
画像bは、同じ方法でコーディングするマージプロセスを示しています。
Write
プログラムがリモートサーバーの操作を遅くしている間、リモートクライアントを待つように運命づけたくありません。そのため、ネットワークからインストリームへのバックグラウンド書き込みと、アウトストリームからネットワークへのバックグラウンド読み取りを手動で整理しようとしました。しかし、バッファリングされたストリームを使用している間は気にしないのでしょうか? バッファリングされたストリームは、読み取り/書き込みプロセスのそのような中断を排除するのでしょうか?