Спулинг
|
Гигабайттебе в спул.
Популярное ругательство |
Термин спулинг (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
может использовать для промежуточного хранения почты как очередь запросов,
так и выделенный каталог в зависимости от конфигурации.
|