Как программы с программным обеспечением с оболочкой уравновешивают скорость вывода / ввода?

Возможный дубликат:
Bash while loop и чтение из трубы

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

Хорошим примером может быть кодирование видео. Предположим, что я указываю декодер на видеофайл, а затем его вывод поступает в качестве входа энкодера. Общий размер декодированного видео больше, чем ram + swap, поэтому я думаю, что вообще нет способа его буферизации. Я нашел о вызовах чтения и записи на stdin и stdout, но мне интересно узнать, что на самом деле происходит, когда кодер этого примера не может справиться со всеми данными одновременно. Это как-то информирует декодер о желаемой скорости? Нужно ли специально разрабатывать программу декодера для такого сигнала и соответственно изменять скорость обработки? Если нет, как все это сбалансируется в конце?

2 Solutions collect form web for “Как программы с программным обеспечением с оболочкой уравновешивают скорость вывода / ввода?”

Когда писатель пишет в трубу, и труба заполнена (ее размер ограничен несколькими килобайтами), ее процесс блокируется, пока один из читателей не освободит некоторое пространство. Точно так же, когда читатель читает трубку, ее процесс блокируется, пока там что-то не появляется.

Существуют также асинхронные записи и чтения, которые программист может использовать для очереди на эти чтения и записи.

Я настоятельно рекомендую прочитать Beej's Gudes , начиная с руководства Beej по обмену Interprocess Unix

Вы называете это двумя аргументами, первое – время сна для писателя, второе – время сна для читателя. Попробуйте называть его args 0 3 и 3 0

 #!/bin/sh write_sleep=$1 read_sleep=$2 writer(){ echo writing output >&2 echo hi sleep $write_sleep echo writing output >&2 echo hi sleep $write_sleep echo writing output >&2 echo hi sleep $write_sleep } reader(){ while true; do echo getting input >&2 read input [ $input ] || { echo input is empty >&2 && break; } echo $input sleep $read_sleep done } writer | reader 

Трубы являются стандартными дескрипторами unix на программном уровне. Когда вы настраиваете две программы для связи по каналу, сначала они видят стандартный вывод и стандартные дескрипторы ввода, с которыми они взаимодействуют, потому что оболочка настроила их таким образом. Есть некоторые особенности с этими дескрипторами при настройке таким образом, но процессы взаимодействуют с ними, как и с любым другим файловым дескриптором (это целая философия unix, вы знаете).

В принципе, процесс записи может записывать столько, сколько он хочет в трубе, но поскольку канал имеет максимальный предел хранения (буфер), он может быть заблокирован, если канал заполнен, или на запрос можно ответить как «попробуйте снова позже ", если писатель не хотел, чтобы он блокировал.

И наоборот, читатель может читать столько, сколько он хочет, но он также может быть заблокирован (или ответил «повторите попытку позже»), если труба пуста.

Linux и Unix - лучшая ОС в мире.