Спулінг
| |
Гигабайттебе в спул.
Популярна лайка |
Термін спулинг (spooling) не має
загальноприйнятого російського аналога. Відповідно до фольклору програміста, слово це
походить від абревіатури Simultaneous Peripherial Operation Off-Line.
Цю фразу важко дослівно перекласти на російську мову; мається на увазі метод
роботи із зовнішніми пристроями виводу (рідше — введення) в багатозадачній ОС
або багатомашинному середовищі, при якому завданням створюється ілюзія одночасного
доступу до пристрою. При цьому, проте, завдання не отримують до пристрою
прямого доступу, а працюють в режимі offline (без
прямого підключення). Дані, що виводяться, накопичуються системою, а
потім виводяться на пристрій так, щоб виведення різних завдань не змішувалося.
Видно, що цей метод роботи частково нагадує простий відкладений запис,
але основне завдання тут не лише і не стільки підвищення продуктивності,
скільки розділення доступу до повільного зовнішнього пристрою.
Частіше всього спулинг застосовується для роботи з друкуючими пристроями,
а для проміжного зберігання даних використовується диск. Багато поштових
систем застосовують механізм, аналогічний спулингу: якщо одержувач не готовий
прийняти лист, або лінія зв'язку з одержувачем зайнята, або взагалі розірвана,
призначений до відправки лист поміщається в чергу. Потім, коли з'єднання
буде встановлено, лист вирушає.
Класичний спулинг реалізований в ОС сімейства Unix. У цих ОС виведення завдання
на друк здійснюється командою lpr. Ця команда
копіює призначені для друку дані в каталог /usr/spoo!/lp, можливо,
пропускаючи їх при цьому через програму-фільтр. Кожна порція даних збожеволіє
в окремий файл. Імена файлів генеруються так, щоб ім'я кожного знов
створеного файлу було "більше" попереднього при порівнянні ASCII-колов.
За рахунок цього файли утворюють чергу.
Системний процес-демон (daemon)
ipd (або lpshed у Unix System V) періодично переглядає каталог.
Якщо там щось з'явилося, а друкуючий пристрій вільний, демон
копіює файл, що з'явився, на пристрій. Після закінчення копіювання
він видаляє файл, тим або іншим способом повідомляє користувача про
закінчення операції (у системах сімейства Unix найчастіше використовується електронна пошта)
і знов переглядає каталог. Якщо там як і раніше
щось є, демон вибирає перший по порядку запит і також копіює
його на пристрій.
Той же механізм використовується поштовою системою Unix- програмою sendmail,
лише замість каталога /usr/spool/lp використовується /usr/spool/mail.
Цей механізм дуже простий, але має один специфічний недолік:
демон не може безпосередньо чекати появи файлів в каталозі, як
можна було б чекати установки семафора або іншого прапора синхронізації.
Якби демон безперервно сканував каталог, це створювало б дуже велике
і даремне навантаження системи. Тому демон прокидається через фіксовані
інтервали часу; якщо за цей час нічого в черзі не з'явилося, демон
засинає знов. Такий підхід також дуже простий, але збільшує час проходження
запитів: запит починає виконуватися не відразу ж після установки, а лише
після того, як демон в черговий раз прокинеться.
У OS/2 і Win32 спулинг організований частково схожим чином з тією різницею,
що установка запиту в чергу може відбуватися не лише командою PRINT
але і простим копіюванням даних на псевдопристрій LPT[1-9|. На відміну
від систем сімейства Unix як програма PRINT
так і псевдопристрої портів активізують процес спулинга безпосередньо
при установці запиту. Графічні драйвери друкуючих пристроїв в цих
системах також використовують спул замість прямого звернення до фізичного
порту.
Novell Netware надає спеціальний механізм для організації спулинга
— черги запитів. Елементи черги в цьому випадку також зберігаються на диску,
але прикладні програми замість перегляду каталога можуть користуватися системними
функціями GetNextMessage і PutMessage.
Виклик GetNextMessage блокується, якщо черга порожня;
таким чином, немає необхідності чекати пробудження демона або спеціальним
чином активізувати його — демон сам прокидається при появі запиту. Цікаво,
що поштова система Mercury Mail для Novell Netware може використовувати
для проміжного зберігання пошти як чергу запитів, так і виділений каталог
залежно від конфігурації.
|