Детали буферизованного потока

Я хочу объяснить мое понимание на примере. Позволять stream быть любым абстрактным буферизованным сетевым потоком с 4-байтовым буфером. Пусть будет какой-то байтовый процесс записи (нарисованный как 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 лагать весь код? Или это будет отставать в четыре раза редко? Разве я не реализовал некоторый кольцевой буфер для передачи данных в него и запустил дополнительный поток, который будет считывать данные из буфера и передавать данные в сетевой поток?

Я также очень надеюсь, что буферизованный сетевой поток может увеличить скорость получения данных.

 read<-|    |  1 |  5 | 12 |<-----net <-7


 using(networkStream)
     while((b = networkStream.ReadByte()) >= 0)
         process(b);

Если я синхронно получаю и обрабатываю байты из буферизованного сетевого потока, могу ли я рассчитывать на то, что данные буфера потока будут передаваться сетевым потоком незаметно (асинхронно), не будут ReadByte лагать весь код? Или это будет отставать в четыре раза редко?

PS я знаю, что стандарт NetworkStream Поток буферизирован.


Хочу рассказать о моем конкретном случае. Я должен понять чередование потоков. Я читаю данные из потока с удаленного клиента и хочу передать их нескольким потокам на удаленные серверы, но с чередованием (это называется разветвлением) ( изображение а), например так

var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
    outStreams[i].Write(buf, 0, c);
    i = (i + 1) % outStreams.Length;
}

изображение б показывает процесс слияния, кодирование аналогичным образом.

Я не хочу обрекать удаленного клиента на ожидание, пока программа будет работать медленно Write на удаленные серверы. Итак, я попытался организовать фоновую запись вручную из сети в inStream и фоновое чтение из outStreams в сеть. Но, может быть, мне все равно, когда я использую буферизованные потоки? Может быть, буферизованные потоки устраняют такие разрывы процессов чтения-записи?

0 ответов

Другие вопросы по тегам