Я слышал историю о том, как Дуглас Маклрой придумал концепцию и как Кен Томпсон реализовал ее за одну ночь.
Насколько я понимаю, pipe - это системный вызов, который разделяет часть памяти между двумя процессами, где один процесс пишет, а другой читает.
Как человек, который не знаком с внутренностями ОС или концепциями, мне было интересно, что именно является «гением» в этой истории? Это идея двух процессов, разделяющих память? Или это реализация? Или оба?
PS: я знаю о полезности канала или о том, как использовать его в оболочке. Речь идет о концепции и реализации|
history
unix
process
pipelining
aoak
источник
источник
pipe()
вызов и|
оператор оболочки (Ссылка: McIlroy ). Или, как мог бы сказать Вольтер: « Если бы [stdio] не существовало, нужно было бы изобрести [это]. » :-)Ответы:
На самом деле нет общей памяти. Читатель и писатель НЕ разделяют какую-либо часть своего адресного пространства и не используют никакой явной синхронизации.
Процессы чтения и записи выполняются,
read
иwrite
системные вызовы выполняются точно так же, как если бы они читали / записывали в файл. В этом гениальность ... инновация: идея о том, что (простое) межпроцессное взаимодействие и файловый ввод / вывод могут обрабатываться одинаково ... с точки зрения прикладного программиста и пользователя.Как только канал настроен, ОС (не код приложения или библиотеки в пользовательском пространстве) заботится о буферизации и координации. Прозрачное.
Напротив, до изобретения концепции конвейера, если бы вам нужно было выполнить «конвейерную» обработку, у вас обычно было бы одно приложение, записывающее выходные данные в файл, а затем, когда оно закончилось, вы запустили бы второе приложение для чтения из файл.
В качестве альтернативы, если вам нужен истинный конвейер, вы можете закодировать оба приложения для установки (реального) сегмента общей памяти и использовать семафоры (или что-то еще) для координации чтения / записи. Сложно ... и, как следствие, не часто делается.
источник
На мой взгляд, гениальность идеи «трубы» заключается в простоте использования.
Вам не нужно делать никаких системных вызовов, выделять память, ничего сложного. В оболочке, можно использовать один символ:
|
. Это дает необычайную силу в сочетании простых (или сложных) инструментов для выполнения определенной задачи.Возьмите некоторые повседневные задачи, такие как аккуратная сортировка текста. У вас может быть команда, которая перечисляет целую кучу имен. (Для моего примера я буду использовать файл, содержащий кучу имен, любезно предоставленный listofrandomnames.com.) Используя каналы, вы можете сделать что-то вроде следующего:
Это только один пример; Есть тысячи. Для некоторых других конкретных задач, которые значительно упрощаются благодаря использованию каналов, см. Раздел «Философия Unix» на этой странице .
Чтобы подчеркнуть этот ответ, см. Слайды с 4 по 9 презентации «Почему Zsh круче вашей оболочки».
Я знаю, что приведенная выше команда включает в себя UUOC . Я оставил это, потому что это заполнитель для произвольной команды, которая генерирует текст.
источник
sort -u
может сделать работуsort | uniq
быстрее.cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Вы могли бы привыкнуть к этому, но я бы не назвал это простым. Особенноawk
часть.Поэтому я попытался провести небольшое исследование по этому вопросу, ища руководства PDP-10 / TOPS-10, чтобы узнать, каков был уровень техники до появления трубок. Я нашел это , но TOPS-10 удивительно трудно гуглить. Есть несколько хороших ссылок на изобретение трубы: интервью с Макилрой , об истории и влиянии UNIX .
Вы должны поместить это в исторический контекст. Немногие из современных инструментов и удобств, которые мы считаем само собой разумеющимся, существовали.
PDP-7 выглядит следующим образом . Обратите внимание на отсутствие интерактивного дисплея или жесткого диска. «Файловая система» будет храниться на магнитной ленте. Было до 64 КБ памяти для программ и данных.
В этой среде программисты, как правило, обращались непосредственно к аппаратному обеспечению, например, выполняя команды для раскручивания ленты и обработки символов по одному, считываемых непосредственно из интерфейса ленты. UNIX предоставил абстракции над этим, так что вместо того, чтобы «читать из телетайпа» и «читать с ленты», будучи отдельными интерфейсами, они были объединены в один, с критически важным добавлением канала «чтение из вывода другой программы без сохранения временной копии на диске». или лента ".
Вот Макилрой на изобретение
grep
. Я думаю, что это хорошо суммирует объем работы, требуемый в среде, предшествующей UNIX.Сравните первую часть этого с
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
примером. Если вы выбираете «построить командную строку» вместо «написать программу специально для этой цели, вручную, на ассемблере», тогда стоит построить командную строку. Даже если для этого потребуется несколько часов чтения (бумажных) руководств. Затем вы можете записать его для дальнейшего использования.источник
Гений Pipes заключается в том, что он объединяет три важные идеи.
Во-первых, трубы - это практическая реализация «сопрограмм», термин, придуманный Конвеем в 1958 году, который был многообещающим, но практически не имел практического применения перед трубами.
Во-вторых, реализовав каналы на языке оболочки, Томпсон и его коллеги изобрели первый настоящий «клейкий язык».
Эти два аспекта позволяют эффективно разрабатывать повторно используемые программные компоненты на низкоуровневом оптимизированном языке, а затем склеивать их, образуя гораздо большую и более сложную функциональность. Они назвали это «Программирование в целом».
В-третьих, реализация каналов с использованием тех же системных вызовов, которые использовались для доступа к файлам, позволяла писать программы с универсальными интерфейсами. Это позволило получить действительно универсальные решения проблем программного обеспечения, которые можно использовать в интерактивном режиме, используя данные из файлов и как часть более крупных программных систем, без единого изменения компонентов программного обеспечения. Нет компиляции, нет конфигурации, просто несколько простых команд оболочки.
Если вы хотите пройти курс обучения, программное обеспечение UNIX сегодня так же полезно, как и 40 лет назад. Мы постоянно изобретаем вещи, которые они уже знали, и строили решения. И ключевым прорывом стала простая Труба. Единственным настоящим нововведением после этого стало создание интернета в 80-х годах. Удивительно, но UNIX провалил свою реализацию, создав отдельный API. Мы все еще страдаем от последствий ... Да, было что-то с видео-дисплеями и мышами, которые стали популярными в конце 80-х. Но это для WIMP.
источник