Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Конвейер из трех программных процессов, выполняемых на текстовом терминале

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

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

process1 | process2 | процесс3

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

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

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

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

Все широко используемые оболочки 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. ^ "Примечания к выпуску 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 года , впервые предлагающая концепцию трубки
  • pipe: создать межпроцессный канал - Справочник по системным интерфейсам, Единая спецификация UNIX , Выпуск 7 из Open Group
  • Pipes: краткое введение от Linux Information Project (LINFO)
  • Unix Pipes - мощная и элегантная парадигма программирования (Softpanorama)
  • Специальный анализ данных из командной строки Unix в Wikibooks - показывает, как использовать конвейеры, состоящие из простых фильтров, для выполнения сложного анализа данных.
  • Использование и злоупотребление каналами с аудиоданными - введение в использование каналов и злоупотребление ими с помощью netcat, nettee и fifos для воспроизведения звука по сети.
  • stackoverflow.com - Вопросы и ответы об обработке конвейера bash.