Яка точна винахідливість труби Unix


52

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

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

Як хтось, хто не знайомий із внутрішніми або поняттями ОС, мені було цікаво, що саме є "генієм" в історії? Це ідея двох процесів обміну пам'яттю? Або це реалізація? Або обоє?

PS: Я знаю про корисність труби або як її використовувати в оболонці. Питання стосується концепції та реалізації проекту|


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

4
Мало того, що вже запущені програми мали ручку стандартного вводу та ручку стандартного виводу, а API-інтерфейси операційної системи Unix мали функції читання / запису, що застосовуються до цих ручок. Розумне використання декількох ортогональних та дуже здібних концепцій (ручки, вихід та вхід з них) призводить не лише до труб, але й до розеток, взаємодії персонажів-пристроїв та десятків інших речей. Отже, тепер у нас є файлові ручки (для tty, що забезпечує введення з клавіатури та виведення тексту), давайте складемо програми, щоб одна програма стала tty іншої.
Воррен П

6
@WarrenP На насправді, Unix , отримав стандартний-введення і стандартний висновок- з - за системний pipe()виклик і |оператор оболонки (Посилання: McIlroy ). Або, як Вольтер міг би сказати: " Якщо [stdio] не існувало, потрібно було б його вигадати. " :-)
Росс Паттерсон

Не було такого поняття, як ручка файлу, ручка вводу та виходу до ПІСЛЯ труби?
Warren P

4
@WarrenP: Це схоже на те, що говорить Паттерсон, так це: спочатку були ручки файлів. Тоді ці хлопці придумали ідею, що кожна програма вводить ручку вводу та вихідну ручку за замовчуванням, що потім дозволяє програмам тривіально ланцюжком. Вони стали називатися "стандартними" введеннями / виводами.
Mooing Duck

Відповіді:


109

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

Насправді, спільної пам'яті немає. Читач і автор не поділяють жодної частини свого адресного простору, і вони не використовують явної синхронізації.

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

Після налаштування труби ОС (не код програми або бібліотеки в просторі користувача) піклується про буферизацію та координацію. Відверто.


На відміну від цього, перед винаходом концепції труби, якщо вам потрібно було обробити "конвеєрну" обробку, ви, як правило, мали б один вихід запису програми у файл, а потім, коли він буде закінчений, ви запустите другу програму для читання з файл.

Крім того, якщо ви хочете справжнього конвеєра, ви можете кодувати обидві програми, щоб створити (справжній) сегмент спільної пам'яті та використовувати семафори (або щось таке) для координації читання / запису. Складне ... і як наслідок це робиться не часто.


34
"ТАК геній ... інновація: уявлення про те, що міжпроцесорна комунікація та файли вводу / виводу можна обробляти однаково" - саме так. Це дозволяє вам мати міжпроцесорний зв’язок між програмами, які ніколи не були розроблені для того, щоб їх мати, і навіть не знаєте, що відбувається.
Guntram Blohm підтримує Моніку

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 надзвичайно важко переглядати в Google. Є кілька хороших посилань на винахід труби: інтерв'ю з Макілроєм , про історію та вплив UNIX .

Ви повинні поставити це в історичний контекст. Небагато сучасних інструментів та зручностей, які ми приймаємо як належне, існувало.

"На початку Томпсон навіть не програмував на PDP, а натомість використовував набір макросів для асемблера GEMAP на машині GE-635." (29) Була сформована паперова стрічка на GE 635, а потім протестована на PDP-7, поки, за словами Рітчі, "примітивне ядро ​​Unix, редактор, асемблер, проста оболонка (інтерпретатор команд) та кілька утиліт (на зразок команд Unix rm, cat, cp). Окрім того, операційна система була госпрозрахунковою, програми можна було писати та перевіряти, не вдаючись до паперової стрічки, а розробка тривала на самому PDP-7 ".

PDP-7 виглядає приблизно так . Зверніть увагу на відсутність інтерактивного дисплея або жорсткого диска. "Файлова система" буде зберігатися на магнітній стрічці. Для програм та даних було до 64 КБ пам'яті.

У такому середовищі програмісти прагнули безпосередньо звертатися до обладнання, наприклад, видаючи команди, щоб розповсюджувати стрічку та обробляти символів один за одним, прочитаним безпосередньо з інтерфейсу стрічки. UNIX надав абстракції щодо цього, так що замість того, щоб "читати з телетипу" і "читати зі стрічки", будучи окремими інтерфейсами, вони були об'єднані в один, з вирішальним додаванням "прочитати з виходу іншої програми без збереження тимчасової копії на диску" або стрічка ".

Ось Макілрой щодо винаходу grep. Я думаю, що це непогано підсумовує обсяг роботи, необхідної в середовищі до UNIX.

"Греп був придуманий для мене. Я робив програму для читання тексту вголос через синтезатор голосу. Коли я винайшов фонетичні правила, я перевірив би у словнику Вебстера слова, на які вони можуть вийти з ладу. Наприклад, як ви справляєтеся з диграфом" ui ', який вимовляється різними способами: «фрукти», «підступність», «винність», «туга», «інтуїт», «бегуїн»? Я б розбив словник на шматки, які вміщуються в обмеженому буфері Ед і використовувати глобальна команда для вибору списку. Я б знищив цей список повторним скануванням ed, щоб побачити, як працює кожне запропоноване правило. "

"Процес був стомлюючим та дуже марнотратним, оскільки словник довелося розділити (не можна було дозволити собі залишити розділену копію на лінії). Потім Ед скопіював кожну частину в / tmp, двічі відсканував її, щоб виконати команду g, і нарешті викинув її, що теж потребує часу ».

"Одного дня я попросив Кена Томпсона, чи зможе він зняти розпізнавальник регулярних виразів з редактора і зробити програму з одноразовим виконанням для цього. Він сказав" так ". Наступного ранку я знайшов у своєму листі повідомлення про програму під назвою grep. Це спрацювало як шарм. На запитання, що означає це кумедне ім'я, Кен сказав, що це очевидно. За командою редактора було те, що воно імітувало, g / re / p (глобальний друк регулярних виразів) ".

Порівняйте першу частину цього з cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100прикладом. Якщо ваші параметри "побудувати командний рядок" проти "написати програму спеціально для цієї мети, вручну, в асемблері", тоді варто побудувати командний рядок. Навіть якщо для цього потрібно кілька годин читання (паперових) посібників, щоб зробити це. Потім ви можете записати це для подальшого використання.


1

Геніальність Труби полягає в тому, що вона поєднує три важливі ідеї.

По-перше, труби - це практичне втілення "спільних процедур", терміна, придуманого Конвеєм у 1958 році, який був багатообіцяючим, але перед його трубою мало практичного застосування.

По-друге, впроваджуючи труби на мові оболонок, Томпсон та ін винайшли першу справжню «мову клею».

Ці два моменти дозволяють ефективно розробляти компоненти програмного забезпечення для багаторазового використання на оптимізованій мові низького рівня, а потім склеювати, щоб утворити набагато більшу, більш складну функціональність. Вони назвали це "Програмуванням у великому".

По-третє, реалізація труб за допомогою тих же системних викликів, які використовувались для доступу до файлів, дозволяла програмам записуватися з універсальними інтерфейсами. Це дозволило по-справжньому універсально вирішити проблеми програмного забезпечення, які можна використовувати в інтерактивному режимі, використовуючи дані з файлів, і як частина великих програмних систем, без жодної зміни компонентів програмного забезпечення. Ні компілювання, ні конфігурація, лише кілька простих команд оболонки.

Якщо ви хочете пройти криву навчання, програмне забезпечення UNIX настільки ж корисне сьогодні, як і 40 років тому. Ми постійно переосмислюємо речі, про які вже знали, і будували рішення. І ключовим проривом став простий Труба. Єдиним справжнім нововведенням після цього стало створення Інтернету у 80-х. Яскраво, UNIX здійснив реалізацію цього, створивши окремий API. Ми все ще страждаємо від наслідків ... О так, було щось із відео-дисплеями та мишами, які стали популярними наприкінці 80-х. Але це для WIMP.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.