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

Системная очередь

Системная очередь — это структура данных, работающая по принципу «первым пришёл — первым обслужен» (FIFO, First In — First Out), используемая в операционных системах (ОС) для организации доступа процессов к ограниченным ресурсам, таким как центральный процессор (ЦП), устройства ввода-вывода или файлы. В отличие от пользовательских очередей (например, в принтерах или мессенджерах), системная очередь управляется ядром ОС и является частью механизма планирования задач, обеспечивая справедливое распределение процессорного времени между конкурирующими процессами или потоками.

История и происхождение

Понятие очереди как способа организации доступа к ресурсам возникло в ранних операционных системах 1960-х годов, таких как CTSS (Compatible Time-Sharing System) и MULTICS. В этих системах, где несколько пользователей одновременно работали с одним компьютером, требовалось упорядочить выполнение программ. Первоначально использовались простые циклические очереди, где каждый процесс получал фиксированный квант времени (time slice). В 1970-х годах, с развитием многозадачности, появились более сложные схемы, включающие многоуровневые очереди (multi-level feedback queues), которые позволяли приоритезировать задачи. В современных ОС (Linux, Windows, macOS) системные очереди реализованы в виде списков готовых процессов (run queue) и списков ожидания (wait queue), управляемых планировщиком.

Классификация системных очередей

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

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

  • Очередь готовых процессов (run queue) — содержит процессы, готовые к выполнению и ожидающие выделения процессорного времени. Управляется планировщиком ЦП.
  • Очередь ожидания (wait queue) — объединяет процессы, заблокированные в ожидании завершения операции ввода-вывода или освобождения ресурса (например, семафора, мьютекса).
  • Очередь устройств (device queue) — используется для доступа к конкретному устройству (диск, принтер, сетевая карта). Каждое устройство может иметь собственную очередь запросов.
  • Очередь сообщений (message queue) — применяется для межпроцессного взаимодействия (IPC), где процессы обмениваются данными через буферы, организованные по принципу FIFO.

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

  • Очередь с абсолютным приоритетом — процессы с более высоким приоритетом всегда обслуживаются раньше, чем с низким. Может приводить к «голоданию» (starvation) низкоприоритетных процессов.
  • Очередь с относительным приоритетом — приоритет учитывается, но не блокирует полностью обслуживание низкоприоритетных задач (например, в многоуровневых очередях).
  • Циклическая очередь (Round Robin) — все процессы получают равные кванты времени, независимо от приоритета. Используется в системах с разделением времени.

По способу реализации

  • Аппаратные очереди — реализованы на уровне микрокода или контроллера прерываний (например, очередь прерываний в архитектуре x86).
  • Программные очереди — управляются ядром ОС, могут быть реализованы как связные списки, массивы или кольцевые буферы.

Устройство и характеристики

Системная очередь в ядре ОС представляет собой структуру данных, содержащую указатели на дескрипторы процессов (task_struct в Linux, PCB — Process Control Block в Windows). Каждый элемент очереди включает идентификатор процесса (PID), состояние, приоритет, время ожидания и другие параметры.

Основные характеристики

  • Длина очереди — количество процессов, ожидающих обслуживания. Может быть ограничена или динамически изменяться.
  • Время ожидания — среднее время, которое процесс проводит в очереди до начала обслуживания. Критично для систем реального времени.
  • Пропускная способность — количество процессов, обслуженных за единицу времени.
  • Справедливость — мера равномерности распределения ресурсов между процессами. В системах с приоритетами справедливость может быть нарушена.

Применение

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

Планирование процессов

В ядре Linux планировщик CFS (Completely Fair Scheduler) использует красно-чёрное дерево для хранения готовых процессов, но в основе лежит концепция очереди: каждый процесс имеет виртуальное время выполнения, и планировщик выбирает процесс с наименьшим значением. В Windows планировщик использует многоуровневые очереди с динамическим приоритетом, где приоритет процесса может повышаться или понижаться в зависимости от поведения (интерактивные vs фоновые задачи).

Управление вводом-выводом

Драйверы устройств часто используют собственные очереди запросов. Например, в подсистеме блочного ввода-вывода Linux (block I/O layer) запросы к диску объединяются в очередь и сортируются по номеру блока (алгоритм лифта — elevator algorithm) для минимизации перемещения головок. В сетевых стеках (например, в ядре FreeBSD) очереди пакетов (ring buffer) используются для приёма и передачи данных.

Межпроцессное взаимодействие

Очереди сообщений (System V IPC, POSIX mq) позволяют процессам обмениваться данными асинхронно. В отличие от каналов (pipes), очереди сообщений поддерживают множественный доступ и приоритеты сообщений. В Windows для IPC используются почтовые ящики (mailslots) и именованные каналы, которые также реализуют очередь.

Системы реального времени

В ОСРВ (например, QNX, VxWorks) очереди используются для строгого соблюдения временных ограничений. Здесь применяются очереди с фиксированным приоритетом и предсказуемым временем доступа. В таких системах недопустимо «голодание» процессов, поэтому алгоритмы планирования гарантируют, что каждый процесс получит ресурс в заданный срок.

Примеры

  • Очередь прерываний (IRQ queue) в ядре Linux: при возникновении аппаратного прерывания контроллер (APIC) помещает номер прерывания в очередь, а ядро обрабатывает их по порядку. В многопроцессорных системах используется распределение очередей между ядрами.
  • Очередь печати (spool queue) в Windows: документы, отправленные на печать, помещаются в очередь диспетчера печати (Print Spooler), который последовательно передаёт их драйверу принтера.
  • Очередь задач в планировщике Hadoop (YARN): приложения (jobs) ставятся в очередь и выполняются в соответствии с политиками (FIFO, Fair Scheduler, Capacity Scheduler).

Интересные факты

  • В ранних версиях UNIX (1970-е) очередь процессов была реализована как простой массив фиксированного размера. При заполнении очереди система блокировала создание новых процессов.
  • В Windows NT (1993) впервые была применена многоуровневая очередь с 32 уровнями приоритета, что позволило эффективно обрабатывать как интерактивные, так и фоновые задачи.
  • В ядре Linux существует понятие «очереди с обратным вызовом» (callback queue), используемое в механизме workqueue для отложенного выполнения задач в контексте процесса.
  • В системах с гипервизором (например, KVM, VMware) очереди виртуальных машин управляются гипервизором, который может применять приоритеты на основе аренды ресурсов (CPU cap, shares).

Критика и ограничения

  • Голодание (starvation) — в системах с абсолютными приоритетами низкоприоритетные процессы могут никогда не получить ресурс, если постоянно поступают высокоприоритетные задачи. Для борьбы с этим используются механизмы повышения приоритета с течением времени (aging).
  • Инверсия приоритетов — высокоприоритетный процесс может быть заблокирован низкоприоритетным, если они совместно используют ресурс (например, мьютекс). В ОСРВ применяются протоколы наследования приоритета (priority inheritance) для предотвращения этой проблемы.
  • Перегрузка очередей — при большом количестве процессов время ожидания может расти нелинейно, что приводит к деградации производительности. В современных системах используются алгоритмы динамического управления нагрузкой (например, контроллеры TCP в сетевых стеках).
  • Сложность отладки — ошибки в управлении очередями (например, потеря элемента, циклические блокировки) могут приводить к «зависанию» системы или утечкам памяти.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015).
  • Love R. «Linux Kernel Development» (3rd edition, 2010).
  • Silberschatz A., Galvin P. B., Gagne G. «Operating System Concepts» (10th edition, 2018).
  • Документация ядра Linux: «Process Scheduling» и «Wait Queues» (kernel.org).
  • Microsoft Docs: «Windows Kernel-Mode Scheduler» (learn.microsoft.com).

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

На главную BFOmetr →