Какова точная изобретательность Unix трубы


52

Я слышал историю о том, как Дуглас Маклрой придумал концепцию и как Кен Томпсон реализовал ее за одну ночь.

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

Как человек, который не знаком с внутренностями ОС или концепциями, мне было интересно, что именно является «гением» в этой истории? Это идея двух процессов, разделяющих память? Или это реализация? Или оба?

PS: я знаю о полезности канала или о том, как использовать его в оболочке. Речь идет о концепции и реализации|


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

4
Мало того, что уже запущенные приложения имели дескриптор стандартного ввода и дескриптор стандартного вывода, а API-интерфейсы Unix-подобных операционных систем имели функции чтения / записи, применяемые к этим дескрипторам. Умное использование нескольких ортогональных и высоко способных концепций (дескрипторы, вывод и ввод из них) приводит не только к каналам, но также к сокетам, взаимодействиям персонажа с устройством и множеству других вещей. Итак, теперь, когда у нас есть дескрипторы файлов (для tty, который обеспечивает ввод с клавиатуры и вывод текста), давайте составим приложения, чтобы одно приложение стало tty другого.
Уоррен П

6
@WarrenP На самом деле, Unix , получил стандартный-ввод и стандартный вывод- из - за системный pipe()вызов и |оператор оболочки (Ссылка: McIlroy ). Или, как мог бы сказать Вольтер: « Если бы [stdio] не существовало, нужно было бы изобрести [это]. » :-)
Росс Паттерсон

Не было такого понятия, как дескриптор файла, а также дескриптор входа и выхода до ПОСЛЕ трубы?
Уоррен П

4
@WarrenP: Звучит так, как говорит Паттерсон: сначала были файловые дескрипторы. Затем эти ребята пришли к мысли, что каждая программа по умолчанию использует дескриптор ввода и дескриптор вывода, что позволяет программам тривиально объединяться. Они стали известны как «стандартный» ввод / вывод.
Mooing Duck

Ответы:


109

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

На самом деле нет общей памяти. Читатель и писатель НЕ разделяют какую-либо часть своего адресного пространства и не используют никакой явной синхронизации.

Процессы чтения и записи выполняются, readи writeсистемные вызовы выполняются точно так же, как если бы они читали / записывали в файл. В этом гениальность ... инновация: идея о том, что (простое) межпроцессное взаимодействие и файловый ввод / вывод могут обрабатываться одинаково ... с точки зрения прикладного программиста и пользователя.

Как только канал настроен, ОС (не код приложения или библиотеки в пользовательском пространстве) заботится о буферизации и координации. Прозрачное.


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

В качестве альтернативы, если вам нужен истинный конвейер, вы можете закодировать оба приложения для установки (реального) сегмента общей памяти и использовать семафоры (или что-то еще) для координации чтения / записи. Сложно ... и, как следствие, не часто делается.


34
«В этом гениальность ... инновация: идея, что межпроцессное взаимодействие и файловый ввод / вывод могут обрабатываться одинаково» - именно это. Это позволяет вам иметь межпроцессное взаимодействие между программами, которые никогда не были разработаны, чтобы иметь его, и даже не (не нужно) знать, что происходит.
Гунтрам Блом поддерживает Монику

6
Также полезно отметить, что причина использования файлового ввода-вывода для IPC была в основном полезной, потому что Unix был разработан для обработки текста - потоковой передачи текстовых данных из программы в программу, что позволяет относительно безболезненное составление, что, в свою очередь, означает, что вся система может быть построена из относительно простые, небольшие программы, которые передают данные от одного к другому в виде (возможно) длинных цепочек простых операций. По сути, это означало, что у вас был относительно гибкий язык для обработки текста.
Луаан

1
Таким образом, «изобретательность канала Unix» - это «изобретательность Unix»: все операции ввода-вывода (включая межпроцессное взаимодействие, стандартные файлы и остальные объекты файловой системы) обрабатываются как файлы.
Марк Херд

Другим гениальным ходом было то, что UNIX защищал удобочитаемые файловые структуры в то время, когда считался каждый байт ...
EvertW

14

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

Вам не нужно делать никаких системных вызовов, выделять память, ничего сложного. В оболочке, можно использовать один символ: |. Это дает необычайную силу в сочетании простых (или сложных) инструментов для выполнения определенной задачи.

Возьмите некоторые повседневные задачи, такие как аккуратная сортировка текста. У вас может быть команда, которая перечисляет целую кучу имен. (Для моего примера я буду использовать файл, содержащий кучу имен, любезно предоставленный listofrandomnames.com.) Используя каналы, вы можете сделать что-то вроде следующего:

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

Это только один пример; Есть тысячи. Для некоторых других конкретных задач, которые значительно упрощаются благодаря использованию каналов, см. Раздел «Философия Unix» на этой странице .


Чтобы подчеркнуть этот ответ, см. Слайды с 4 по 9 презентации «Почему Zsh круче вашей оболочки».


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


3
Крошечная крошечная записка : sort -uможет сделать работу sort | uniqбыстрее.
Iwillnotexist Idonotexist

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100Вы могли бы привыкнуть к этому, но я бы не назвал это простым. Особенно awkчасть.
Федерико Полони

Эти трубы просты. Я сказал: «... необычайная сила в сочетании простых (или сложных) инструментов для выполнения определенной задачи».
Wildcard

5

Поэтому я попытался провести небольшое исследование по этому вопросу, ища руководства PDP-10 / TOPS-10, чтобы узнать, каков был уровень техники до появления трубок. Я нашел это , но TOPS-10 удивительно трудно гуглить. Есть несколько хороших ссылок на изобретение трубы: интервью с Макилрой , об истории и влиянии UNIX .

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

«В начале, Томпсон даже не программировал на самом PDP, а вместо этого использовал набор макросов для ассемблера GEMAP на машине GE-635». (29) Бумажная лента была сгенерирована на GE 635 и затем протестирована на PDP-7 до тех пор, пока, по словам Ричи, «примитивное ядро ​​Unix, редактор, ассемблер, простая оболочка (интерпретатор команд) и несколько утилит (таких как команды Unix rm, cat, cp) не были завершены. Дело в том, что операционная система была автономной, программы можно было писать и тестировать, не прибегая к бумажной ленте, и разработка самой PDP-7 продолжалась ».

PDP-7 выглядит следующим образом . Обратите внимание на отсутствие интерактивного дисплея или жесткого диска. «Файловая система» будет храниться на магнитной ленте. Было до 64 КБ памяти для программ и данных.

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

Вот Макилрой на изобретение grep. Я думаю, что это хорошо суммирует объем работы, требуемый в среде, предшествующей UNIX.

«Grep был изобретен для меня. Я делал программу для чтения текста вслух через синтезатор голоса. Когда я изобрел фонетические правила, я проверял словарь Вебстера на наличие слов, в которых они могут потерпеть неудачу. Например, как вы справляетесь с орграфом» ui ', который произносится многими разными способами:' fruit ',' guile ',' guilty ',' anguish ',' intuit ',' beguine '? Я разбил бы словарь на части, которые помещались бы в ограниченный буфер ed и использовал глобальная команда для выбора списка. Я бы сократил этот список путем повторного сканирования с помощью ed, чтобы увидеть, как работает каждое предлагаемое правило ".

«Процесс был утомительным и ужасно расточительным, поскольку словарь нужно было разделить (нельзя было оставить разделенную копию в строке). Затем ed скопировал каждую часть в / tmp, дважды отсканировал ее, чтобы выполнить команду g, и, наконец, выбросил его, что тоже требует времени. "

«Однажды днем ​​я спросил Кена Томпсона, может ли он вынуть из редактора распознаватель регулярных выражений и создать для этого однопроходную программу. Он сказал« да ». На следующее утро я нашел в своем письме заметку, объявляющую программу под названием grep. Это сработало как шарм. Когда его спросили, что означает это забавное имя, Кен ответил, что оно очевидно. Оно обозначало команду редактора, которую он имитировал, g / re / p (глобальная печать регулярного выражения). "

Сравните первую часть этого с cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100примером. Если вы выбираете «построить командную строку» вместо «написать программу специально для этой цели, вручную, на ассемблере», тогда стоит построить командную строку. Даже если для этого потребуется несколько часов чтения (бумажных) руководств. Затем вы можете записать его для дальнейшего использования.


1

Гений Pipes заключается в том, что он объединяет три важные идеи.

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

Во-вторых, реализовав каналы на языке оболочки, Томпсон и его коллеги изобрели первый настоящий «клейкий язык».

Эти два аспекта позволяют эффективно разрабатывать повторно используемые программные компоненты на низкоуровневом оптимизированном языке, а затем склеивать их, образуя гораздо большую и более сложную функциональность. Они назвали это «Программирование в целом».

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

Если вы хотите пройти курс обучения, программное обеспечение UNIX сегодня так же полезно, как и 40 лет назад. Мы постоянно изобретаем вещи, которые они уже знали, и строили решения. И ключевым прорывом стала простая Труба. Единственным настоящим нововведением после этого стало создание интернета в 80-х годах. Удивительно, но UNIX провалил свою реализацию, создав отдельный API. Мы все еще страдаем от последствий ... Да, было что-то с видео-дисплеями и мышами, которые стали популярными в конце 80-х. Но это для WIMP.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.