0

私の理解を例を挙げて説明したいと思います。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倍遅れますか?

NetworkStreamPS標準ストリームがバッファリングされていることは知っています。


私の具体的なケースについて教えてください。ストリームのストライピングを実現する必要があります。リモートクライアントからストリームからデータを読み取り、それをリモートサーバーへの複数のストリームに渡したいのですが、このように交互に(フォークと呼ばれます)(画像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プログラムがリモートサーバーの操作を遅くしている間、リモートクライアントを待つように運命づけたくありません。そのため、ネットワークからインストリームへのバックグラウンド書き込みと、アウトストリームからネットワークへのバックグラウンド読み取りを手動で整理しようとしました。しかし、バッファリングされたストリームを使用している間は気にしないのでしょうか? バッファリングされたストリームは、読み取り/書き込みプロセスのそのような中断を排除するのでしょうか?

4

0 に答える 0