Что такое конвейер команд в теории ос
Перейти к содержимому

Что такое конвейер команд в теории ос

  • автор:

Конвейер (Unix)

Эта статья посвящена оригинальной реализации оболочек. Общие сведения о программных конвейерах см. В разделе « Конвейер (программное обеспечение)» .

Конвейер из трех программных процессов, выполняемых на текстовом терминале

В Unix-подобных компьютерных операционных системах , A трубопровод представляет собой механизм для связи между процессами с помощью передачи сообщений. Конвейер — это набор процессов, объединенных в цепочку своими стандартными потоками , так что выходной текст каждого процесса ( stdout ) передается непосредственно как вход ( stdin ) следующему. Второй процесс запускается, поскольку первый процесс все еще выполняется, и они выполняются одновременно . Концепция конвейеров была отстаивалась Дугласом Макилроем в прародине Unix в Bell Labs.во время разработки Unix, формируя его философию инструментария . [1] [2] Он назван по аналогии с физическим конвейером . Ключевой особенностью этих конвейеров является «сокрытие внутренних компонентов» (Ritchie & Thompson, 1974). Это, в свою очередь, обеспечивает большую ясность и простоту системы.

Эта статья посвящена анонимным каналам , в которых данные, записанные одним процессом, буферизуются операционной системой до тех пор, пока они не будут прочитаны следующим процессом, и этот однонаправленный канал исчезает, когда процессы завершаются. Это отличается от именованных каналов , где сообщения передаются в канал или из канала, которому присвоено имя путем преобразования его в файл, и остаются после завершения процессов. Стандартный синтаксис оболочки для анонимных каналов состоит в том, чтобы перечислить несколько команд, разделенных вертикальными чертами («каналы» в обычном слове Unix):

process1 | process2 | процесс3
ls -l | ключ grep | меньше

» ls -l » создает процесс, вывод (stdout) которого передается по конвейеру на ввод (stdin) процесса для «grep key»; и то же самое для процесса «меньше». Каждый процесс принимает входные данные из предыдущего процесса и производит выходные данные для следующего процесса через стандартные потоки . Каждый » | » указывает оболочке соединить стандартный вывод команды слева со стандартным вводом команды справа с помощью механизма межпроцессного взаимодействия , называемого (анонимным) конвейером , реализованного в операционной системе. Трубы однонаправленные; данные проходят по конвейеру слева направо.

  • 1 Конвейеры в интерфейсах командной строки
    • 1.1 Поток ошибок
    • 1.2 Трубоперерабатывающий завод
    • 3.1 Сетевые трубы
    • 4.1 Другие операционные системы

    Конвейеры в интерфейсах командной строки [ править ]

    Все широко используемые оболочки Unix имеют специальную синтаксическую конструкцию для создания конвейеров. При любом использовании команды записываются последовательно, разделенные вертикальной чертой ASCII » » (которая по этой причине часто называется » вертикальной чертой | «). Оболочка запускает процессы и устанавливает необходимые соединения между их стандартными потоками (включая некоторый объем буферной памяти).

    Поток ошибок [ править ]

    По умолчанию стандартные потоки ошибок (» stderr «) процессов в конвейере не передаются по конвейеру; вместо этого они объединяются и направляются на консоль . Однако многие оболочки имеют дополнительный синтаксис для изменения этого поведения. Например, в оболочке csh использование » |& » вместо » | » означает, что стандартный поток ошибок также должен быть объединен со стандартным выводом и передан следующему процессу. Bourne Shell может также слить стандартную ошибку с |& так Баш 4.0 [3] или с использованием 2>&1 , а также перенаправить его в другой файл.

    Трубопровод [ править ]

    В наиболее часто используемых простых конвейерах оболочка соединяет серию подпроцессов через конвейеры и выполняет внешние команды внутри каждого подпроцесса. Таким образом, сама оболочка не выполняет прямой обработки данных, проходящих через конвейер.

    Тем не менее, это возможно для оболочки для выполнения обработки непосредственно, используя так называемую мельницу или pipemill (так как while команда используется для «мельницы» над результатами начальной команды). Эта конструкция обычно выглядит примерно так:

    команда | пока читаем -r var1 var2 . ; do # обрабатывать каждую строку, используя переменные, проанализированные в var1, var2 и т.д. # (обратите внимание, что это может быть подоболочка: var1, var2 и т. д. будут недоступны # после завершения цикла while; некоторые оболочки, такие как zsh и новее # версии оболочки Korn обработайте команды слева от оператора pipe # в подоболочке) выполнено

    Такая конвейерная обработка может работать не так, как задумано, если тело цикла включает в себя команды, такие как cat и ssh , которые читаются из stdin : [4] на первой итерации цикла, такая программа (назовем ее стоком ) будет читать оставшийся вывод из command , и затем цикл завершится (с результатами в зависимости от специфики слива). Есть несколько способов избежать такого поведения. Во-первых, некоторые стоки поддерживают возможность отключения чтения из stdin (например ssh -n ). В качестве альтернативы, если стоку не нужно читать какие-либо данные, stdin чтобы сделать что-то полезное, его можно использовать < /dev/null как ввод.

    Поскольку все компоненты конвейера выполняются параллельно, оболочка обычно создает подпроцесс (подоболочку) для обработки своего содержимого, что делает невозможным распространение изменений переменных во внешнюю среду оболочки. Чтобы решить эту проблему, вместо этого «конвейер» может быть загружен из документа здесь, содержащего подстановку команд , которая ожидает, пока конвейер завершит работу, прежде чем прорезать содержимое. В качестве альтернативы для параллельного выполнения можно использовать именованный канал или подстановку процесса . В GNU bash также есть lastpipe возможность отключить разветвление для последнего компонента канала. [5]

    Программное создание конвейеров [ править ]

    Конвейеры можно создавать под управлением программы. pipe() Системный вызов Unix просит операционную систему создать новый объект анонимного канала . Это приводит к появлению двух новых открытых файловых дескрипторов в процессе: конец канала, доступный только для чтения, и конец, доступный только для записи. Концы каналов выглядят как обычные анонимные файловые дескрипторы , за исключением того, что они не имеют возможности поиска.

    Чтобы избежать взаимоблокировки и использовать параллелизм, процесс Unix с одним или несколькими новыми каналами обычно вызывает fork() создание новых процессов. Затем каждый процесс закроет конец (и) канала, который он не будет использовать, прежде чем производить или потреблять какие-либо данные. В качестве альтернативы процесс может создавать новые потоки и использовать канал для связи между ними.

    Именованные каналы также могут быть созданы с использованием mkfifo() или, mknod() а затем представлены в качестве входного или выходного файла программам по мере их вызова. Они позволяют создавать многопутевые каналы и особенно эффективны в сочетании со стандартным перенаправлением ошибок или с tee .

    Реализация [ править ]

    В большинстве Unix-подобных систем все процессы конвейера запускаются одновременно, их потоки соответствующим образом связаны и управляются планировщиком вместе со всеми другими процессами, запущенными на машине. Важным аспектом этого, отличающим каналы Unix от других реализаций каналов, является концепция буферизации : например, программа-отправитель может производить 5000 байт в секунду., и принимающая программа может принимать только 100 байтов в секунду, но данные не теряются. Вместо этого вывод программы-отправителя сохраняется в буфере. Когда принимающая программа готова к чтению данных, следующая программа в конвейере читает из буфера. В Linux размер буфера составляет 65 536 байт (64 КБ). Доступен сторонний фильтр с открытым исходным кодом, называемый bfr, для предоставления при необходимости больших буферов.

    Сетевые трубы [ править ]

    Такие инструменты , как Netcat и SOCAT можно подключить трубы к TCP / IP сокетов .

    История [ править ]

    Концепция конвейера была изобретена Дугласом Макилроем [6] и впервые описана на страницах руководства версии 3 Unix . [7] Макилрой заметил, что большую часть времени командные оболочки передают выходной файл из одной программы в качестве входных данных в другую.

    Его идеи были реализованы в 1973 году, когда («в одну лихорадочную ночь», писал Макилрой) Кен Томпсон добавил pipe() системный вызов и каналы в оболочку и несколько утилит в версии 3 Unix. «На следующий день, — продолжил Макилрой, — произошла незабываемая оргия шуток, когда все присоединились к азарту сантехники». Макилрой также приписывает Томпсону | обозначение, которое значительно упростило описание синтаксиса конвейера в Версии 4 . [8] [7]

    Несмотря на независимость разработки, конвейеры Unix связаны с «коммуникационными файлами», разработанными Кеном Лохнером [9] в 1960-х годах для Дартмутской системы разделения времени , и предшествовали им . [10]

    В коммуникационных последовательных процессах (CSP) Тони Хора трубки Макилроя получили дальнейшее развитие. [11]

    Робот в пиктограмме от Apple «S Automator , который также использует концепцию конвейера для повторяющихся команд цепи вместе, держит трубу в честь оригинальной концепции Unix.

    Другие операционные системы [ править ]

    Основная статья: Pipeline (программное обеспечение)

    Эта особенность Unix была заимствована другими операционными системами, такие как MS-DOS и CMS трубопроводы пакет на VM / CMS и MVS , и в конце концов стала назначила трубу и фильтры шаблон дизайна из программной инженерии .

    См. Также [ править ]

    • Все является файлом — описывает одну из определяющих особенностей Unix; конвейеры воздействуют на «файлы» в смысле Unix
    • Анонимный канал — структура FIFO, используемая для межпроцессного взаимодействия
    • GStreamer — мультимедийный фреймворк на основе конвейера
    • Конвейеры CMS
    • Итеративная
    • Именованный канал — постоянные каналы, используемые для межпроцессного взаимодействия
    • Подстановка процесса — синтаксис оболочки для подключения нескольких каналов к процессу
    • GNU parallel
    • Конвейер (вычисления) — другие связанные с компьютером конвейеры
    • Перенаправление (вычисления)
    • Тройник (команда) — общая команда для извлечения данных из конвейера
    • XML pipeline — для обработки файлов XML
    • xargs

    Ссылки [ править ]

    1. ^ Махони, Майкл С. «Проект устной истории Unix: Выпуск.0, Начало» . Макилрой: Это было одно из немногих мест, где я почти осуществил управленческий контроль над Unix, настаивал на этом, да.
    2. ^ http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html [ постоянная мертвая ссылка ]
    3. ^ «Примечания к выпуску Bash» . tiswww.case.edu . Проверено 14 июня 2017 .
    4. ^ «Взаимодействие цикла оболочки с SSH» . 6 марта 2012 года Архивировано из оригинала 6 марта 2012 года.
    5. ^ John1024. «Как я могу сохранить результаты команды« найти »в виде массива в Bash» . Переполнение стека .
    6. ^ «Создание операционной системы UNIX» . Bell Labs. Архивировано из оригинального 14 сентября 2004 года.
    7. ^ а б Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
    8. ^ http://www.linfo.org/pipe.html Pipes: краткое введение от Linux Information Project (LINFO)
    9. ^ http://www.cs.rit.edu/~swm/history/DTSS.doc
    10. ^ http://cm.bell-labs.com/who/dmr/hist.html [ постоянная мертвая ссылка ]
    11. ^ https://swtch.com/~rsc/thread/ Bell Labs и потоки CSP (Расс Кокс)
    • Сал Согоян в эпизоде ​​3 MacBreak «Enter the Automatrix»

    Внешние ссылки [ править ]

    • История канальной нотации Unix
      • Оригинальная записка Дуга Макилроя 1964 года , впервые предлагающая концепцию трубки

      Конвейер (вычисления) — Pipeline (computing)

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

      Связанные с компьютером конвейеры включают:

      • конвейеры команд, такие как классический конвейер RISC, которые используются в центральных процессорах (ЦП) и другие микропроцессоры, чтобы обеспечить перекрывающееся выполнение множества инструкций с одной и той же схемой . Схема обычно делится на этапы, и каждый этап обрабатывает определенную часть одной инструкции за раз, передавая частичные результаты на следующий этап. Примерами этапов являются декодирование инструкций, арифметические / логические операции и выборка из регистров. Они связаны с технологиями суперскалярного исполнения, пересылки операндов, спекулятивного исполнения и внепланового исполнения.
      • графических конвейеров, присутствующие в большинстве графических процессоров (ГП), которые состоят из нескольких арифметических блоков или полных ЦП, которые реализуют различные этапы общих операций рендеринга (перспективная проекция, окно обрезка, расчет цвета и света, рендеринг и т. Д.).
      • Программные конвейеры, которые состоят из последовательности вычислительных процессов (команд, запусков программ, задач, потоков, процедур и т. д.), концептуально выполняемых параллельно, при этом выходной поток одного процесса автоматически подается в качестве входного потока. следующего. Системный вызов Unixpipe является классическим примером этой концепции.
      • конвейерная обработка HTTP, метод выдачи нескольких запросов HTTP через один и тот же TCP-соединение, не дожидаясь завершения предыдущего, прежде чем выдать новое.

      Некоторые операционные системы могут предоставлять UNIX-подобный синтаксис для нескольких строк программа выполняется в конвейере, но реализует последнее как простое последовательное выполнение, а не истинную конвейерную обработку, а именно, ожидая завершения каждой программы перед запуском следующей.

      • 1 Концепция и мотивация
      • 2 Соображения по проекту
        • 2.1 Балансировка стадий
        • 2.2 Буферизация
        • 2.3 Нелинейные конвейеры
        • 2.4 Зависимости между элементами

        Концепция и мотивация

        Конвейерная обработка — это широко используемое понятие в повседневной жизни. Например, на сборочной линии автомобильного завода каждая конкретная задача — такая как установка двигателя, установка капота и установка колес — часто выполняется на отдельном рабочем месте. Станции выполняют свои задачи параллельно, каждая на своем автомобиле. Как только автомобиль выполнил одно задание, он переезжает на следующую станцию. Различия во времени, необходимом для выполнения задач, можно компенсировать «буферизацией» (удерживание одной или нескольких машин в пространстве между станциями) и / или «остановкой» (временной остановкой вышестоящих станций) до тех пор, пока не станет доступна следующая станция..

        Предположим, что для сборки одной машины требуется три задачи, которые занимают 20, 10 и 15 минут соответственно. Тогда, если бы все три задачи выполняла одна станция, завод выпускал бы одну машину каждые 45 минут. Используя трубопровод из трех станций, завод будет выпускать первую машину за 45 минут, а затем новую каждые 20 минут.

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

        Рекомендации по проектированию

        Балансировка этапов

        Поскольку пропускная способность конвейера не может быть лучше, чем пропускная способность его самого медленного элемента, разработчик должен попытаться разделить работу и ресурсы между этапы, чтобы все они занимали одинаковое время для выполнения своих задач. В приведенном выше примере сборки автомобиля, если на каждую из трех задач требуется 15 минут вместо 20, 10 и 15 минут, задержка все равно будет 45 минут, но новая машина будет завершаться каждые 15 минут вместо 20.

        Буферизация

        В идеальных условиях, если все элементы обработки синхронизированы и для обработки требуется одинаковое количество времени, тогда каждый элемент может быть получен каждым элементом так же, как он был освобожден предыдущим один за один цикл clock. Таким образом, предметы будут течь по трубопроводу с постоянной скоростью, как волны в водном канале. В таких «волновых конвейерах» не требуется никакой синхронизации или буферизации между этапами, кроме хранилища, необходимого для элементов данных.

        В более общем смысле, буферизация между этапами конвейера необходима, когда время обработки нерегулярно или когда элементы могут быть созданы или уничтожены вдоль конвейера. Например, в графическом конвейере, который обрабатывает треугольники для отображения на экране, элемент, который проверяет видимость каждого треугольника, может отбрасывать треугольник, если он невидим, или может выводить два или более треугольных фрагмента элемента, если они частично скрыто. Буферизация также необходима для устранения отклонений в скорости, с которой приложение подает элементы на первый этап и потребляет выходные данные последнего.

        Буфер между двумя каскадами может быть просто аппаратным регистром с подходящей логикой синхронизации и сигнализации между двумя каскадами. Когда каскад A сохраняет элемент данных в регистре, он посылает сигнал «данные доступны» следующему каскаду B. После того, как B использует эти данные, он отвечает сигналом «данные получены» в A. Стадия A останавливается, ожидая для этого сигнала перед сохранением следующего элемента данных в регистре. Этап B останавливается, ожидая сигнала «данные доступны», если он готов обработать следующий элемент, но этап A еще не предоставил его.

        Если время обработки элемента является переменным, весь конвейер может часто останавливаться, ожидая, пока этот элемент и все предыдущие элементы потребят элементы в своих входных буферах. Частоту таких остановок конвейера можно уменьшить, предоставив место для более чем одного элемента во входном буфере этого этапа. Такой буфер из нескольких элементов обычно реализуется как очередь «первым пришел — первым вышел». Стадия восходящего потока может все еще быть остановлена, когда очередь будет заполнена, но частота этих событий будет уменьшаться по мере предоставления большего количества буферных слотов. Теория организации очередей может определить количество необходимых буферных слотов в зависимости от изменчивости времени обработки и желаемой производительности.

        Нелинейные конвейеры

        Если какой-то этап занимает (или может занять) намного больше времени, чем другие, и не может быть ускорен, разработчик может предоставить два или более элемента обработки для выполнения этой задачи в параллельно, с одним буфером ввода и одним буфером вывода. Когда каждый элемент завершает обработку своего текущего элемента данных, он доставляет его в общий выходной буфер и берет следующий элемент данных из общего входного буфера. Примером этой концепции «нелинейного» или «динамического» конвейера являются магазины или банки, у которых есть два или более кассира, обслуживающих клиентов из одной очереди ожидания.

        Зависимости между элементами

        В некоторых приложениях обработка элемента Y на этапе A может зависеть от результатов или эффекта обработки предыдущего элемента X на более позднем этапе B конвейера. В этом случае этап A не может правильно обработать элемент Y, пока элемент X не очистит этап B.

        Такая ситуация очень часто возникает в конвейерах команд. Например, предположим, что Y — арифметическая инструкция, которая считывает содержимое регистра, который должен был быть изменен более ранней инструкцией X. Пусть A будет этапом, на котором выполняется выборка команды операндов, а B будет этап, который записывает результат в указанный регистр. Если этап A пытается обработать инструкцию Y до того, как инструкция X достигнет этапа B, регистр может все еще содержать старое значение, и эффект Y будет неправильным.

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

        • Задержка: Каждый затронутый этап, такой как A, останавливается до разрешения зависимости, то есть до тех пор, пока не будет доступна требуемая информация и / или требуемое состояние не будет достигнуто. 142>Изменение порядка элементов: Вместо остановки, этап A может отложить элемент Y в сторону и искать любой последующий элемент Z в своем входном потоке, который не имеет никаких зависимостей с каким-либо более ранним элементом. В конвейерах команд этот метод называется выполнение вне очереди.
        • Предположение и возврат: Одним из важных примеров зависимости от элемента к элементу является обработка условного перехода инструкция X по конвейеру инструкций. Первый этап A конвейера, который выбирает следующую команду Y для выполнения, не может выполнить свою задачу до тех пор, пока X не получит свой операнд и не определит, следует ли переходить или нет. Это может занять много тактов, поскольку операнд X может, в свою очередь, зависеть от предыдущих инструкций, которые извлекают данные из основной памяти.

        Затраты и недостатки

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

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

        Дополнительные затраты на сложность конвейерной обработки могут быть значительными, если существуют зависимости между обработкой различных элементов, особенно если для их обработки используется стратегия предположения и возврата. Действительно, стоимость реализации этой стратегии для сложных наборов команд послужила причиной некоторых радикальных предложений по упрощению компьютерной архитектуры, таких как RISC и VLIW. Компиляторы также были обременены задачей переупорядочения машинных инструкций, чтобы улучшить производительность конвейеров команд.

        См. Также

        • Поток данных
        • Пропускная способность
        • Параллелизм
        • Конвейер команд
          • Классический конвейер RISC
          • AMULET, конвейерный процессор.
          • Конвейер (Unix)
          • Конвейер Хартмана для ВМ
          • BatchPipes для MVS

          Ссылки

          1. ^Data Pipeline Development Опубликовано Dativa, получено 24 мая 2018 г.
          2. ^О. Хаук; Сорин А. Хус; М. Гарг. «Двухфазные асинхронные волновые конвейеры и их применение в 2D-DCT». семантик. Проверено 14 сентября 2019 г.

          Библиография

          • Перес Гарсия, Пабло (2018). Конвейер DSL и dsl для создания конвейера CI / CD для ваших проектов. ISBN 978-0-134-69147-3 .
          • Стандартное обсуждение конвейерной обработки в параллельных вычислениях см. В Quinn, Michael J. (2004). Параллельное программирование на C с MPI и openMP. Дубьюк, Айова: McGraw-Hill Professional. ISBN 0072822562.

          Конвейер (Unix)

          В Unix-подобных компьютерных операционных системах , A трубопровод представляет собой механизм для связи между процессами с помощью передачи сообщений. Конвейер — это набор процессов, объединенных в цепочку своими стандартными потоками , так что выходной текст каждого процесса ( stdout ) передается непосредственно как вход ( stdin ) следующему. Второй процесс запускается, поскольку первый процесс все еще выполняется, и они выполняются одновременно . Концепция конвейеров была отстаивалась Дугласом Макилроем в прародине Unix в Bell Labs.во время разработки Unix, формируя его философию инструментария . [1] [2] Он назван по аналогии с физическим конвейером . Ключевой особенностью этих конвейеров является «сокрытие внутренних компонентов» (Ritchie & Thompson, 1974). Это, в свою очередь, обеспечивает большую ясность и простоту системы.

          Конвейер из трех программных процессов, выполняемых на текстовом терминале

          Эта статья посвящена анонимным каналам , в которых данные, записанные одним процессом, буферизуются операционной системой до тех пор, пока они не будут прочитаны следующим процессом, и этот однонаправленный канал исчезает, когда процессы завершаются. Это отличается от именованных каналов , где сообщения передаются в канал или из канала, которому присвоено имя путем преобразования его в файл, и остаются после завершения процессов. Стандартный синтаксис оболочки для анонимных каналов состоит в том, чтобы перечислить несколько команд, разделенных вертикальными чертами («каналы» в обычном многословии Unix):

          command1 | command2 | command3
          ls -l | ключ grep | меньше

          Команда ls -l выполняется как процесс, выходные данные (stdout) которого передаются по конвейеру на вход (stdin) процесса для grep key ; и то же самое для процесса для less . Каждый процесс принимает входные данные из предыдущего процесса и производит выходные данные для следующего процесса через стандартные потоки . Каждый | указывает оболочке соединить стандартный вывод команды слева со стандартным вводом команды справа с помощью механизма межпроцессного взаимодействия , называемого (анонимным) конвейером , реализованного в операционной системе. Трубы однонаправленные; данные проходят по конвейеру слева направо.

          Ниже приведен пример конвейера, который реализует своего рода проверку орфографии для веб- ресурса, указанного URL-адресом . Объяснение того, что он делает, следует.

          curl "https://en.wikipedia.org/wiki/Pipeline_(Unix)" | sed 's / [^ a-zA-Z] / / g' | tr 'AZ' 'az \ n' | grep '[az]' | sort -u | comm -23 - < ( sort / usr / share / dict / words ) |меньше 
          1. curlполучает HTML- содержимое веб-страницы (может использоваться wget в некоторых системах).
          2. sedзаменяет все символы (из содержимого веб-страницы), не являющиеся пробелами или буквами, пробелами. ( Новые строки сохраняются.)
          3. tr заменяет все прописные буквы на строчные и преобразует пробелы в строках текста в новые строки (каждое «слово» теперь находится в отдельной строке).
          4. grepвключает только строки, содержащие хотя бы один строчный алфавитный символ (без пустых строк).
          5. sortсортирует список «слов» в алфавитном порядке, а -u переключатель удаляет дубликаты.
          6. commнаходит общие строки между двумя файлами, -23 подавляет строки, уникальные для второго файла, и те, которые являются общими для обоих, оставляя только те, которые находятся только в первом названном файле. — Вместо файла вызывает comm использовать стандартный ввод (из трубопровода в данном случае). sort /usr/share/dict/words сортирует содержимое words файла в алфавитном порядке, как и comm ожидалось, и <( . ) выводит результаты во временный файл (посредством подстановки процесса ), который comm читает. Результатом является список слов (строк), которых нет в / usr / share / dict / words.
          7. less позволяет пользователю пролистывать результаты.

          Конвейеры в интерфейсах командной строки

          Все широко используемые оболочки Unix имеют специальную синтаксическую конструкцию для создания конвейеров. При любом использовании команды записываются последовательно, разделенные символом вертикальной черты ASCII (который по этой причине часто называют « вертикальной чертой | »). Оболочка запускает процессы и устанавливает необходимые соединения между их стандартными потоками (включая некоторый объем буферной памяти).

          Поток ошибок

          По умолчанию стандартные потоки ошибок (» stderr «) процессов в конвейере не передаются по конвейеру; вместо этого они объединяются и направляются на консоль . Однако многие оболочки имеют дополнительный синтаксис для изменения этого поведения. В оболочке csh , например, использование |& вместо | означает, что стандартный поток ошибок также должен быть объединен со стандартным выводом и передан следующему процессу. Bourne Shell может также слить стандартную ошибку с |& так Баш 4.0 [3] или с использованием 2>&1 , а также перенаправить его в другой файл.

          Трубный завод

          В наиболее часто используемых простых конвейерах оболочка соединяет серию подпроцессов через конвейеры и выполняет внешние команды внутри каждого подпроцесса. Таким образом, сама оболочка не выполняет прямой обработки данных, проходящих через конвейер.

          Тем не менее, это возможно для оболочки для выполнения обработки непосредственно, используя так называемую мельницу или pipemill (так как while команда используется для «мельницы» над результатами начальной команды). Эта конструкция обычно выглядит примерно так:

          команда | пока читаем -r var1 var2 . ; do # обрабатывать каждую строку, используя переменные, проанализированные в var1, var2 и т.д. # (обратите внимание, что это может быть подоболочка: var1, var2 и т. д. будут недоступны # после завершения цикла while; некоторые оболочки, такие как zsh и новее # версии оболочки Korn обработайте команды слева от оператора pipe # в подоболочке) выполнено

          Такая конвейерная обработка может работать не так, как задумано, если тело цикла включает в себя команды, такие как cat и ssh , которые читаются из stdin : [4] на первой итерации цикла, такая программа (назовем ее стоком ) будет читать оставшийся вывод из command , и затем цикл завершится (с результатами в зависимости от специфики слива). Есть несколько способов избежать такого поведения. Во-первых, некоторые стоки поддерживают возможность отключения чтения из stdin (например ssh -n ). В качестве альтернативы, если стоку не нужно читать какие-либо данные, stdin чтобы сделать что-то полезное, его можно использовать < /dev/null как ввод.

          Поскольку все компоненты конвейера выполняются параллельно, оболочка обычно создает подпроцесс (подоболочку) для обработки своего содержимого, что делает невозможным распространение изменений переменных во внешнюю среду оболочки. Чтобы решить эту проблему, вместо этого «конвейер» может быть загружен из документа здесь, содержащего подстановку команд , которая ожидает, пока конвейер завершит работу, прежде чем прорезать содержимое. В качестве альтернативы для параллельного выполнения можно использовать именованный канал или подстановку процесса . В GNU bash также есть lastpipe возможность отключить разветвление для последнего компонента канала. [5]

          Программное создание конвейеров

          Конвейеры можно создавать под управлением программы. pipe() Системный вызов Unix просит операционную систему создать новый объект анонимного канала . Это приводит к появлению двух новых открытых файловых дескрипторов в процессе: конец канала, доступный только для чтения, и конец, доступный только для записи. Концы каналов выглядят как обычные анонимные файловые дескрипторы , за исключением того, что они не имеют возможности поиска.

          Чтобы избежать взаимоблокировки и использовать параллелизм, процесс Unix с одним или несколькими новыми каналами обычно вызывает fork() создание новых процессов. Затем каждый процесс закроет конец (и) канала, который он не будет использовать, прежде чем производить или потреблять какие-либо данные. В качестве альтернативы процесс может создавать новые потоки и использовать канал для связи между ними.

          Именованные каналы также могут быть созданы с использованием mkfifo() или, mknod() а затем представлены в качестве входного или выходного файла программам по мере их вызова. Они позволяют создавать многопутевые каналы и особенно эффективны в сочетании со стандартным перенаправлением ошибок или с tee .

          Выполнение

          В большинстве Unix-подобных систем все процессы конвейера запускаются одновременно, их потоки соответствующим образом связаны и управляются планировщиком вместе со всеми другими процессами, запущенными на машине. Важным аспектом этого, устанавливая каналы Unix отдельно от других реализаций каналов, является концепция буферизации : например, программа-отправитель может производить 5000 байтов в секунду , а программа-получатель может принимать только 100 байтов в секунду, но не данные потеряны. Вместо этого вывод программы-отправителя сохраняется в буфере. Когда принимающая программа готова к чтению данных, следующая программа в конвейере читает из буфера. В Linux размер буфера составляет 65 536 байт (64 КБ). Доступен сторонний фильтр с открытым исходным кодом, называемый bfr, для предоставления при необходимости больших буферов.

          Сетевые трубы

          Такие инструменты , как Netcat и SOCAT можно подключить трубы к TCP / IP сокетов .

          Концепция конвейера была изобретена Дугласом Макилроем [6] и впервые описана на страницах руководства версии 3 Unix . [7] Макилрой заметил, что большую часть времени командные оболочки передают выходной файл из одной программы в качестве входных данных в другую.

          Его идеи были реализованы в 1973 году, когда («в одну лихорадочную ночь», — писал Макилрой) Кен Томпсон добавил pipe() системный вызов и каналы в оболочку и несколько утилит в версии 3 Unix. «На следующий день, — продолжил Макилрой, — произошла незабываемая оргия шуток, когда все присоединились к азарту сантехники». Макилрой также приписывает Томпсону | обозначение, которое значительно упростило описание синтаксиса конвейера в Версии 4 . [8] [7]

          Несмотря на независимость разработки, конвейеры Unix связаны с «коммуникационными файлами», разработанными Кеном Лохнером [9] в 1960-х годах для Дартмутской системы разделения времени , и им предшествовали . [10]

          В коммуникационных последовательных процессах (CSP) Тони Хора трубки Макилроя получили дальнейшее развитие. [11]

          Робот в пиктограмме от Apple «S Automator , который также использует концепцию конвейера для повторяющихся команд цепи вместе, держит трубу в честь оригинальной концепции Unix.

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

          Эта особенность Unix была заимствована другими операционными системами, такие как MS-DOS и CMS трубопроводы пакет на VM / CMS и MVS , и в конце концов стала назначила трубу и фильтры шаблон дизайна из программной инженерии .

          Смотрите также

          • Все является файлом — описывает одну из определяющих особенностей Unix; конвейеры воздействуют на «файлы» в смысле Unix
          • Анонимный канал — структура FIFO, используемая для межпроцессного взаимодействия
          • GStreamer — мультимедийный фреймворк на основе конвейера
          • Конвейеры CMS
          • Итеративная
          • Именованный канал — постоянные каналы, используемые для межпроцессного взаимодействия
          • Подстановка процесса — синтаксис оболочки для подключения нескольких каналов к процессу
          • GNU parallel
          • Конвейер (вычисления) — другие связанные с компьютером конвейеры
          • Перенаправление (вычисления)
          • Тройник (команда) — общая команда для извлечения данных из конвейера
          • XML pipeline — для обработки файлов XML
          • xargs

          Рекомендации

          1. ^ Махони, Майкл С. «Проект устной истории Unix: Выпуск.0, Начало» . Макилрой: Это было одно из немногих мест, где я почти осуществил управленческий контроль над Unix, настаивал на этом, да.
          2. ^ http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html [ постоянная мертвая ссылка ]
          3. ^
          4. «Примечания к выпуску Bash» . tiswww.case.edu . Проверено 14 июня 2017 .
          5. ^
          6. «Взаимодействие цикла оболочки с SSH» . 6 марта 2012 года Архивировано из оригинала 6 марта 2012 года.
          7. ^
          8. Джон1024. «Как я могу сохранить результаты команды« найти »в виде массива в Bash» . Переполнение стека .
          9. ^
          10. «Создание операционной системы UNIX» . Bell Labs. Архивировано из оригинального 14 сентября 2004 года.
          11. ^ а б
          12. Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
          13. ^ http://www.linfo.org/pipe.html Pipes: краткое введение от Linux Information Project (LINFO)
          14. ^ http://www.cs.rit.edu/~swm/history/DTSS.doc
          15. ^ http://cm.bell-labs.com/who/dmr/hist.html [ постоянная мертвая ссылка ]
          16. ^ https://swtch.com/~rsc/thread/ Bell Labs и потоки CSP (Расс Кокс)
          • Сал Согоян в эпизоде ​​3 MacBreak «Enter the Automatrix»

          Внешние ссылки

          • История канальной нотации Unix
            • Оригинальная записка Дуга Макилроя 1964 года , впервые предлагающая концепцию трубки

            Конвейер (Unix) — Pipeline (Unix)

            В Unix-подобных компьютерных операционных системах конвейер представляет собой механизм межпроцессного взаимодействия с использованием передачи сообщений. Конвейер — это набор процессов, объединенных в цепочку своими стандартными потоками, так что выходной текст каждого процесса (stdout ) передается непосредственно как вход (stdin ) к следующему. Второй процесс запускается, поскольку первый процесс все еще выполняется, и они выполняются одновременно. Идею конвейеров отстаивал Дуглас Макилрой на прародине Unix, в Bell Labs, во время разработки Unix, формируя его философию инструментария.. Он назван по аналогии с физическим конвейером . Ключевой особенностью этих конвейеров является «сокрытие внутренних компонентов» (Ritchie Thompson, 1974). Это, в свою очередь, обеспечивает большую ясность и простоту системы.

            Эта статья посвящена анонимным каналам, где данные, записанные одним процессом, буферизуются операционной системой до тех пор, пока они не будут прочитаны следующим процессом, и этот однонаправленный канал исчезает, когда процессы завершены. Это отличается от именованных каналов, где сообщения передаются в канал или из канала, которому присвоено имя в виде файла, и остаются после завершения процессов. Стандартный синтаксис оболочки оболочки для анонимных каналов состоит в том, чтобы перечислить несколько команд, разделенных вертикальными чертами («каналы» в обычном слове Unix):

            process1 | process2 | process3

            Например, чтобы вывести список файлов в текущем каталоге (ls ), оставьте только строки вывода ls, содержащие строку «key» (grep ) и просмотрите результат на прокручиваемой странице (меньше ), пользователь вводит следующее в командной строке терминала:

            ls -l | ключ grep | less

            » ls -l «создает процесс, вывод (stdout) которого передается по конвейеру на ввод (stdin) процесса для» grep key «, а также для процесса для» less «. Каждый процесс принимает входные данные от предыдущего процесса и производит выходные данные для следующего процесса через стандартные потоки. Каждый « | » сообщает оболочке, что нужно подключить стандартный выход команда слева к стандартному вводу команды справа с помощью механизма межпроцессного взаимодействия, который называется (анонимный) канал, реализованный в операционной системе. Каналы являются однонаправленными; данные проходят по конвейеру слева направо.

            • 1 Конвейеры в интерфейсах командной строки
              • 1.1 Поток ошибок
              • 1.2 Pipemill
              • 3.1 Сетевые каналы
              • 4.1 Другие операционные системы

              Конвейеры в интерфейсах командной строки

              Все широко используемые оболочки Unix ls имеет специальную синтаксическую конструкцию для создания конвейеров. При любом использовании команды записываются последовательно, разделенные символом ASCII вертикальной черты « | » (который по этой причине часто называют «трубкой персонаж»). Оболочка запускает процессы и устанавливает необходимые соединения между их стандартными потоками (включая некоторый объем памяти buffer ).

              Поток ошибок

              По умолчанию стандартные потоки ошибок («stderr ») процессов в конвейере не передаются через труба; вместо этого они объединяются и направляются в консоль. Однако многие оболочки имеют дополнительный синтаксис для изменения этого поведения. Например, в оболочке csh использование « | » вместо « | » означает, что стандартный поток ошибок также должен быть объединен со стандартным выводом и переданы в следующий процесс. Bourne Shell также может объединять стандартную ошибку с | начиная с bash 4.0 или с помощью 2>1 , а также перенаправлять ее в другой файл.

              Pipemill

              В наиболее часто используемых простых конвейерах оболочка соединяет серию подпроцессов через каналы и выполняет внешние команды внутри каждого подпроцесса. Таким образом, сама оболочка не выполняет прямой обработки данных, проходящих через конвейер.

              Однако оболочка может выполнять обработку напрямую, используя так называемые mill или pipemill (поскольку команда при используется для «измельчения» результатов начальной команды). Эта конструкция обычно выглядит примерно так:

              команда | пока читаем -r var1 var2. ; do # обрабатывать каждую строку, используя переменные, проанализированные в var1, var2 и т. д. # (обратите внимание, что это может быть подоболочка: var1, var2 и т. д. будут недоступны # после завершения цикла while; некоторые оболочки, такие как zsh и более новые # версии оболочки Korn обрабатывают команды слева от оператора pipe # в подоболочке) done

              Такая конвейерная обработка может не работать должным образом, если тело цикла включает команды, такие как cat и ssh , который читает из stdin : на первой итерации цикла такая программа (назовем ее стоком) будет читать оставшийся вывод из команда , и цикл завершится (с результатами в зависимости от специфики слива). Есть несколько способов избежать такого поведения. Во-первых, некоторые стоки поддерживают возможность отключения чтения из stdin (например, ssh -n ). В качестве альтернативы, если стоку не нужно читать какой-либо ввод из stdin , чтобы сделать что-то полезное, ему можно передать в качестве ввода.

              Поскольку все компоненты конвейера выполняются параллельно, оболочка обычно формирует подпроцесс (подоболочку) для обработки своего содержимого, что делает невозможным распространение изменений переменных во внешнюю среду оболочки. Чтобы решить эту проблему, вместо этого «конвейер» может быть загружен из здесь документа, содержащего подстановку команды, которая ожидает завершения работы конвейера перед тем, как просмотреть содержимое. В качестве альтернативы для параллельного выполнения можно использовать именованный канал или процесс подстановки. GNU bash также имеет параметр lastpipe для отключения разветвления для последнего компонента конвейера.

              Создание конвейеров программным способом

              Конвейеры могут быть созданы под управлением программы. Системный вызов Unix pipe() просит операционную систему создать новый объект анонимный канал. Это приводит к появлению двух новых открытых файловых дескрипторов в процессе: конец канала только для чтения и конец только для записи. Концы каналов выглядят как обычные анонимные файловые дескрипторы, за исключением того, что у них нет возможности поиска.

              Чтобы избежать взаимоблокировки и использовать параллелизм, процесс Unix с одним или несколькими новыми каналами обычно вызывает fork() для создавать новые процессы. Затем каждый процесс закроет конец (и) канала, который он не будет использовать, прежде чем производить или потреблять какие-либо данные. В качестве альтернативы процесс может создавать новые потоки и использовать канал для связи между ними.

              Именованные каналы также могут быть созданы с помощью mkfifo () или mknod () , а затем представлены как входной или выходной файл для программ как они вызываются. Они позволяют создавать многопутевые каналы и особенно эффективны в сочетании со стандартным перенаправлением ошибок или с tee .

              Реализация

              В большинстве Unix-подобных систем все процессы конвейер запускается одновременно с их потоками, соответствующим образом подключенными, и управляется планировщиком вместе со всеми другими процессами, запущенными на машине. Важным аспектом этого, отличающим каналы Unix от других реализаций каналов, является концепция буферизации : например, программа-отправитель может производить 5000 байтов за секунду, и принимающая программа может принимать только 100 байтов в секунду, но данные не теряются. Вместо этого вывод программы-отправителя сохраняется в буфере. Когда принимающая программа готова к чтению данных, следующая программа в конвейере читает из буфера. В Linux размер буфера составляет 65 536 байт (64 КБ). Доступен сторонний фильтр с открытым исходным кодом под названием bfr для предоставления при необходимости буферов большего размера.

              Сетевые каналы

              Такие инструменты, как netcat и socat, могут подключать каналы к сокетам TCP / IP .

              История

              Концепция конвейера была изобретена Дугласом Макилроем и впервые описана на страницах руководства в Версия 3 Unix. Макилрой заметил, что большую часть времени командные оболочки передают выходной файл из одной программы в качестве входных данных в другую.

              Его идеи были реализованы в 1973 году, когда («в одну лихорадочную ночь», — писал Макилрой) Кен Томпсон добавил системный вызов pipe () и каналы в оболочку и несколько утилит в версии 3 Unix. «На следующий день, — продолжил Макилрой, — произошла незабываемая оргия шуток, когда все присоединились к азарту сантехники». Макилрой также приписывает Томпсону обозначение | , которое значительно упростило описание синтаксиса конвейера в версии 4.

              Несмотря на то, что конвейеры Unix были разработаны независимо, они связаны с «связью» и предшествовали ей. files ‘, разработанный Кеном Лохнером в 1960-х годах для Дартмутской системы разделения времени.

              . В Тони Хоаре последовательные процессы обмена (CSP) получили дальнейшее развитие трубки Макилроя.

              Робот на значке Apple Automator, который также использует концепцию конвейера для связывания повторяющихся команд вместе, держит конвейер в знак уважения к исходной концепции Unix.

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

              Эта функция Unix была заимствована другими операционными системами, такими как Taos и MS-DOS, и в конечном итоге стало шаблоном проектирования конвейеров и фильтров разработки программного обеспечения.

              См. также

              • Все является файлом — описывает одну из определяющих особенностей Unix; конвейеры воздействуют на «файлы» в смысле Unix
              • Анонимный конвейер — структура FIFO, используемая для межпроцессного взаимодействия
              • GStreamer — основанная на конвейере мультимедийная структура
              • Конвейеры CMS
              • Iteratee
              • Именованный канал — постоянные каналы, используемые для межпроцессного взаимодействия
              • Замена процесса — синтаксис оболочки для подключения нескольких каналов к процессу
              • GNU parallel
              • конвейер (вычисления) — другой компьютер связанные конвейеры
              • Перенаправление (вычисление)
              • Тройник (команда) — общая команда для извлечения данных из конвейера
              • конвейер XML — для обработки файлов XML
              • xargs

              Ссылки

              Внешние ссылки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *