Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologiyi_rozpodilenikh_sistem_ta_paralelnik...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
850.43 Кб
Скачать

4. Модель „виробники-споживачі"

Процес-виробник виконує обчислення і виводить потік результатів. Процес-споживач вводить і аналізує потік значень. Багато програм в тій або іншій формі є виробниками і/або споживачами. Поєднання стає особливо цікавим, якщо виробники і споживачі об'єднані в конвеєр — послідовність процесів, в якій кожний з них споживає дані виходу попередника і проводить дані для наступного процесу. Класичним прикладом є конвеєри в операційній системі Unix.

Звичайно прикладний процес в ОС Unix зчитує дані із стандартного файлу вводу stdin і записує в стандартний файл виводу stdout. Звичайно файл вводу— це клавіатура терміналу, з якого викликано програму, а файл виводу — дисплей цього терміналу. Але однієї з найбільш могутніх функцій, запропонованих в ОС Unix, була можливість прив'язки стандартних "пристроїв" вводу-виводу до різних типів файлів. Зокрема, файли stdin і/або stdout можуть бути пов'язані з файлом даних або з "файлом" особливого типу, який називається каналом.

Канал — це буфер (черга типу FIFO, що працює за принципом "First in — first out", тобто "першим увійшов, першим вийшов") між процесом-виробником і процесом-споживачем. Він містить зв'язану послідовність символів. Нові значення дописуються до неї, коли виробник виконує запис в канал. Символи виаляються, коли процес-споживач зчитує їх з каналу.

Прикладна програма в ОС Unix тільки читає дані з файлу stdin, не піклуючись про те, звідки насправді вони туди потрапили. Якщо файл stdin пов'язаний з клавіатурою - на вхід поступають символи, набрані на клавіатурі. Якщо файл stdin пов'язаний з певним файлом - вводиться послідовність символів з цього файлу. Якщо файл stdin пов'язаний з каналом - то вводиться послідовність символів, записаних в цей канал. Аналогічно програма виконує запис у файл stdout, не піклуючись про те, куди насправді поступають дані.

Канали ОС Unix звичайно визначаються за допомогою однієї з командних мов, наприклад csh (С shell — "оболонка С "). Приклад мови csh:

sed -f Script $* | tbl |eqn | groff Macros -

Цей конвейєр містить чотири команди: 1) sed, потоковий текстовий редактор; 2) tbl, процесор таблиць; 3) eqn, процесор рівнянь і 4) groff, програма, що створює дані у форматі Postscript з початкових файлів у форматі troff. Кожна пара команд розділена вертикальною межею, що позначає канал в С shell.

На малюнку 2 показана структура цього конвейєра. Кожна команда є процесом-фільтром. Вхід фільтру sed утворений файлом редагуючих команд (Script) і аргументами командного рядка ($*), якими в даному випадку є відповідні початкові файли тексту книги. Вихід редактора sed передається програмі tbl, направляючій свої вихідні дані програмі eqn, а та передає свій вихід програмі groff. Фільтр groff читає файл Macros для цієї книги, прочитує і обробляє свій стандартний вхід, а потім посилає вихід на принтер в офісі автора.

Мал.2. Конвейєр процесів

Кожен потік на мал. 2 реалізований зв'язаним буфером: синхронізованою чергою значень типу FIFO. Процес-виробник чекає (при необхідності), поки в буфері з'явиться вільне місце, потім додає в кінець буфера новий рядок. Процес-споживач чекає (при необхідності), поки в буфері не з'явиться рядок даних, потім забирає її.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]