Открыть сервис

Спулинг

Спулинг (от англ. spooling — «наматывание на катушку», «шпуля») — это метод организации вычислительного процесса, при котором данные временно помещаются в специальную область памяти (буфер или очередь) для последующей обработки или передачи, что позволяет синхронизировать работу быстрых и медленных устройств, а также разграничить доступ к общим ресурсам. Термин наиболее часто используется в контексте управления вводом-выводом в операционных системах, где спулинг позволяет программам продолжать работу, не дожидаясь завершения операции с медленным периферийным устройством (например, принтером или плоттером).

Принцип работы

Основная идея спулинга заключается в создании промежуточного хранилища (спула), в которое данные записываются с высокой скоростью одним процессом (например, приложением), а затем считываются и обрабатываются другим процессом (драйвером устройства) с более низкой скоростью. Это устраняет необходимость в прямой синхронизации между быстрым источником и медленным приёмником.

В классической схеме спулинга участвуют три компонента:

  1. Источник данных (процесс-производитель) — приложение, генерирующее данные для вывода (например, текстовый редактор, отправляющий документ на печать).
  2. Спул — область на диске или в оперативной памяти, организованная в виде очереди (FIFO — First In, First Out). В современных системах спул часто реализуется в виде файлов на жёстком диске или SSD, что позволяет хранить большие объёмы данных и восстанавливать очередь после перезагрузки системы.
  3. Устройство вывода (процесс-потребитель) — медленное периферийное устройство (принтер, плоттер, графопостроитель) или канал связи, работающий в асинхронном режиме.

Процесс-планировщик спула (спулер) управляет очередью: он принимает задания от приложений, помещает их в спул, а затем по мере освобождения устройства вывода извлекает следующее задание и передаёт его на обработку. Это позволяет нескольким приложениям одновременно отправлять данные на одно устройство без взаимных блокировок.

История возникновения

Концепция спулинга возникла в 1950-х годах, в эпоху мейнфреймов, когда стоимость процессорного времени была чрезвычайно высока, а периферийные устройства (перфокарты, магнитные ленты, построчные принтеры) работали в тысячи раз медленнее центрального процессора. Прямая синхронизация приводила к тому, что процессор простаивал, ожидая завершения операций ввода-вывода.

Первые реализации спулинга были аппаратно-программными. Например, в IBM System/360 использовался метод «Simultaneous Peripheral Operations On-Line» (SPOOL), который дал название всему понятию. В этой системе данные с медленных устройств (считывателей перфокарт) сначала записывались на быстрый магнитный диск, а затем считывались оттуда процессором. Аналогично, вывод на принтер сначала накапливался на диске, а затем печатался в фоновом режиме.

В 1960-1970-х годах спулинг стал стандартной функцией операционных систем (например, OS/360, MULTICS, Unix). В Unix-подобных системах спулинг традиционно реализовался через демоны (фоновые процессы), такие как lpd (line printer daemon) или cupsd (Common Unix Printing System), которые управляют очередями печати.

Классификация спулинга

Спулинг можно классифицировать по типу ресурса, для которого организуется очередь, и по месту хранения спула.

По типу ресурса

По месту хранения спула

Спулинг в современных операционных системах

Windows

В операционных системах семейства Windows спулинг печати реализован через службу Print Spooler (spoolsv.exe). Эта служба управляет всеми заданиями на печать, отправленными из приложений. При отправке документа на печать:

  1. Приложение вызывает API печати Windows (GDI или XPS).
  2. Драйвер принтера преобразует документ в формат, понятный принтеру (например, PCL, PostScript или XPS).
  3. Служба Print Spooler сохраняет задание в виде файла .spl в папке %SystemRoot%\System32\spool\PRINTERS\.
  4. Служба также может создать файл .shd (Shadow), содержащий информацию о задании (имя пользователя, приоритет, количество копий).
  5. Когда принтер освобождается, спулер извлекает задание из очереди и передаёт его на печать.

Сбои в работе службы Print Spooler — одна из частых причин проблем с печатью в Windows. В 2021 году была обнаружена критическая уязвимость PrintNightmare (CVE-2021-34527), позволявшая удалённо выполнять код через спулер печати, что привело к массовым обновлениям безопасности.

Unix и Linux

В Unix-подобных системах традиционно используется система CUPS (Common Unix Printing System), разработанная Майклом Свитом в 1997 году. CUPS использует протокол IPP (Internet Printing Protocol) и предоставляет веб-интерфейс для управления принтерами и очередями. Очереди спула хранятся в каталоге /var/spool/cups/. Демон cupsd принимает задания, преобразует их с помощью фильтров (например, Ghostscript для PostScript) и передаёт на принтер через бэкенды (USB, параллельный порт, сеть).

Мобильные операционные системы

В мобильных ОС (Android, iOS) спулинг также присутствует, но реализован иначе. Например, в Android служба печати Print Spooler управляет очередями для Wi-Fi Direct и Bluetooth-принтеров, а также для облачных сервисов печати (Google Cloud Print, прекративший работу в 2020 году).

Преимущества и недостатки

Преимущества

Недостатки

Спулинг в других областях

Помимо печати, термин «спулинг» используется в более широком смысле:

Связанные понятия

Источники

  1. Таненбаум Э., Бос Х. «Современные операционные системы». 4-е издание. — СПб.: Питер, 2015. — Глава 5 «Ввод-вывод».
  2. Silberschatz A., Galvin P. B., Gagne G. «Operating System Concepts». 10th Edition. — Wiley, 2018. — Chapter 13 «I/O Systems».
  3. Microsoft Docs. «Print Spooler Architecture» (Windows Client Documentation).
  4. CUPS (Common Unix Printing System) Documentation. «Overview of CUPS Printing». — OpenPrinting.org.
  5. CVE-2021-34527 (PrintNightmare). — National Vulnerability Database (NVD), NIST.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →