Конвеєри (Unix)![]() В Unix-подібних операційних системах конвеєр — це механізм міжпроцесної взаємодії, що використовує передачу повідомлень. Є набором поєднаних між собою процесів, які забезпечують передачу даних так, що стандартний вихідний потік кожного процесу (stdout) безпосередньо з'єднується зі стандартним вхідним потоком (stdin) наступного. Наступний процес починається, поки перший ще виконується і вони виконуються одночасно. Концепцію було запропоновано Дугласом Макілроєм в Bell Labs, колисці Unix, в процесі його розробки та формування філософії інструментизації[1][2]. Назву дано за аналогією зі справжніми конвеєрами. Ключовою функцією цих конвеєрів є «приховування нутрощів» (Ritchie & Thompson, 1974). Це забезпечує системі чистоту за простоту. У цій статті йдеться про неіменовані канали, де дані, повернені одним процесом, буферизуються системою, поки не будуть зчитані наступним процесом і цей односпрямований канал зникає з закінченням процесів. Це відрізняється від іменованих каналів, де повідомлення передаються між процесами файлами, які залишаються по закінченні процесів. Стандартний shell-синтаксис для неіменованих каналів — це список декількох команд, розділених вертикальними рисками («пайпи» в розмовній лексиці користувачів Unix): command1 | command2 | command3
Наприклад, щоб отримати список файлів в поточній директорії, зберегти лише стрічку ls виводу, що має рядок "key" (grep) і показати результат на сторінці, що прогортується (less), користувач може написати в командний рядок терміналу наступне: ls -l | grep key | less
Команда ПрикладиНижче наведений приклад конвеєра, що реалізовує перевірку орфографії для веб-сторінки, на яку вказує посилання. curl "https://en.wikipedia.org/wiki/Pipeline_(Unix)" |
sed 's/[^a-zA-Z ]/ /g' |
tr 'A-Z ' 'a-z\n' |
grep '[a-z]' |
sort -u |
comm -23 - <(sort /usr/share/dict/words) |
less
Конвеєри в інтерфейсах командного рядкаВсі широко використовувані оболонки Unix мають власний синтаксис для створення конвеєрів. Загалом, команди пишуть послідовно, розділюючи їх вертикальною рискою ASCII Потік виводу помилокЗа замовчуванням стандартні потоки виводу помилок («stderr») процесів в конвеєрі не передаються далі, натомість з'єднуються і направляються в консоль. Однак, багато оболонок мають додатковий синтаксис для зміни цих налаштувань. Наприклад, використання Канальні роздрібнювачіУ найпростіших та найпоширеніших конвеєрах, оболонка з'єднує серію підпроцесів каналами і виконує зовнішні команди безпосередньо в підпроцесі. Таким чином сама оболонка не виконує прямої обробки даних, що передаються каналом. Однак, оболонка може напряму обробляти дані, використовуючи так звані канальні роздрібнювачі (оскільки команда command | while read -r var1 var2 ...; do
# process each line, using variables as parsed into var1, var2, etc
# (note that this may be a subshell: var1, var2 etc will not be available
# after the while loop terminates; some shells, such as zsh and newer
# versions of Korn shell, process the commands to the left of the pipe
# operator in a subshell)
done
Такі конструкти можуть виконуватись некоректно, якщо тіло циклу містить такі команди, як Оскільки всі складові каналу виконуються паралельно, оболонка типово розділяє підпроцес (підоболонку), щоб обробити його вміст, що унеможливлює поширення зміни змінної в зовнішню оболонку. Щоб виправити цю проблему, даний конструкт може прийняти значення з here-документу, що містить командне заміщення, яке очікує завершення конвеєру, перш ніж проходитись по даних. В альтернативу цьому, для розпаралелення можна використовувати іменовані канали або заміщення процесів. GNU bash також має варіант Програмне створення конвеєрівКонвеєри можуть бути створені програмно. Системний виклик в Unix Щоб уникнути взаємного блокування та використати розпаралелення, Unix процес з одним або більше новим каналом викликає Іменовані канали теж можна створити командою ВиконанняВ більшості Unix-подібних системах всі процеси конвеєра починаються одночасно. Їхні потоки повинні бути відповідно правильно під'єднані і організовані планувальником разом з іншими процесами, що виконуються машиною. Важливим аспектом цього є наступне: відділяти Unix канали від інших каналів, що виконуються, є концептом буферингу. Наприклад, програма-відправник може генерувати 5000 байтів на секунду, а програма-отримувач може отримувати лише 100 байтів на секунду, але при цьому дані не втрачаються, а зберігаються в буфері. Коли отримувач готовий приймати дані, наступний процес конвеєру зчитує їх з буферу. Якщо він заповнений, програма-відправник блокується, поки певний об'єм даних не переміститься з буферу до отримувача. В Лінуксі розмір буферу складає 65546 байтів (64КБ). У відкритих джерелах можна знайти сторонній фільтр bfr для забезпечення буферу більшого об'єму при потребі. ІсторіяДуглас Макілрой[5] винайшов концепт конвеєру і вперше описав його в посібнику для Version 3 Unix[6]. Макілрой помітив, що дуже часто командні оболонки передавали вихідні дані однієї програми на вхід іншій. Його ідеї були втілені в 1973 році, коли Кен Томпсон додав системний виклик Див. такожПосилання
|
Portal di Ensiklopedia Dunia