Выполняет ли конвейер команды параллельно?

Выполняет ли конвейер команды параллельно?

Я пытаюсь глубже понять конвейеризацию и перенаправление. В каждом руководстве говорится, что в cmd1 | cmd2cmd1 будет выполнено, а stdout будет совместно использоваться со stdin cmd2. Но это не очень хорошо укладывается в моей голове, поэтому я проверил:

Так что похоже, что и ./test.shиgrep запущены впараллельно!

Вот исходный код:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

Попытка использовать его с разными рекомендациями дает схожие результаты. Трубы идут параллельно?

Как работают конвейер и перенаправление «под капотом»?

решение1

Да, все команды выполняются одновременно. В вашем случае запускается grepодновременно с test.sh, но поскольку он считывает свой stdin, он блокируется до тех пор, пока не test.shпоместит в него что-то, что не произойдет одновременно. Два процесса следуют друг за другом, если второй медленный, первый заполнит свой выходной буфер stdout и будет вынужден ждать, пока второй не прочитает что-то. Если первый медленный, второй блокируется, пока он считывает ввод, если его нет.

В реальной жизни stdout первого процесса записывается довольно большими кусками (около 4К)(*), поэтому второму процессу нечего читать, пока первый процесс не запишет данные по крайней мере на 4К. Ваше test.shиспользование echoможет немного отличаться и делать вывод с буферизацией строк.

(*) Правило заключается в том, что если вывод осуществляется на "tty" (т.е. терминал), он буферизуется построчно: LF в выводе вызывает фактический вывод. В противном случае он буферизуется блоками по 4 КБ. Первый процесс также может явно подавить всю буферизацию, но это плохо для производительности.

решение2

На самом деле вы смотрите на то, что называется flow control, и/или (пере)направлением -- снова; flow control, или stdin, stdout(стандартный вход / стандартный выход).

Надеюсь, мое утверждение выше поможет вам лучше понять, чтонамеревалсяпроизойти, и что вы можете лучшеожидать.

трубка, или "трубопровод" stdout, простонаправляет stdoutв большинстве случаев.

Параллельно этоДействительнодругое название длятандем. Ты можешьпытатьсядля запуска 2 разных/одинаковых команд/выводов одновременно. Но ожидаясинхронизированныйбежать было бы неразумно, так как это маловероятно.

К вашему примеру; Здесь вы представляете то, что называетсяусловный. Примерно то же самое, что дорожный знак или светофор. Этиусловный(с)прямой потокоснованный насостояние. В вашем примерепока"состояние" --пока этот, делатьчто. Условия в целомперенаправить stdin, stdout.

В прямом ответе на ваши 2 прямых вопроса

  1. Труба идет параллельно?

Нет, не обязательно. По крайней мере, не внормальныйчувство «параллельности» (тандема).

Но pipe можетогонь (инициировать) 2рабочие местав то же время. Дажетакой жеработадважды.

  1. Как работают конвейер и перенаправление «под капотом»?

Надеюсь, я лучше проиллюстрировал это выше. :)

или

cat ./ASCII | grep somename >./output

Вышеизложенное cat ./ASCIIявляетсявыход( stdout). Который становитсявход( stdin) посредствомтрубка( |) для grep somename. Что является(пере)направленный( >) к его окончательному результату ./output.

Связанный контент