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

Планировщик операционной системы

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

История развития планировщиков

Ранние вычислительные системы

В первых операционных системах, работавших в пакетном режиме (например, IBM OS/360), планирование было примитивным. Процессы выполнялись последовательно, один за другим, без возможности прерывания. Планировщик лишь выбирал следующую задачу из очереди после завершения текущей. Это обеспечивало простоту реализации, но приводило к низкой интерактивности и неэффективному использованию процессора при ожидании ввода-вывода.

Появление многозадачности

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

Эра персональных компьютеров

В 1980-е годы, с выходом MS-DOS и ранних версий Windows, планировщики были кооперативными: процесс сам должен был добровольно уступать процессор. Это делало систему уязвимой к зависаниям. Перелом наступил с появлением Windows 95 и Linux (1991 год), которые внедрили вытесняющее планирование реального времени.

Современные подходы

В XXI веке планировщики эволюционировали для работы с многоядерными процессорами (SMP — симметричная многопроцессорность), гибридными архитектурами (big.LITTLE в ARM) и виртуализацией. Современные алгоритмы, такие как CFS (Completely Fair Scheduler) в Linux, ориентированы на энергоэффективность и минимальные задержки.

Классификация алгоритмов планирования

По способу переключения контекста

  • Кооперативное (невытесняющее) планирование — процесс сам решает, когда освободить процессор. Используется в простых встраиваемых системах и некоторых реализациях планировщиков для реального времени.
  • Вытесняющее планирование — планировщик принудительно прерывает процесс по истечении кванта времени или при возникновении события более высокого приоритета. Применяется во всех современных ОС общего назначения (Windows, Linux, macOS).

По приоритетности

  • Статические приоритеты — приоритет процесса задаётся один раз при создании и не меняется. Простота реализации, но негибкость.
  • Динамические приоритеты — приоритет может изменяться в зависимости от поведения процесса (например, повышаться для интерактивных задач). Используется в Windows (с 1993 года) и Linux.

По цели оптимизации

  • Планирование реального времени (RT) — гарантирует выполнение задачи за строго определённое время. Делится на жёсткое (hard real-time — опоздание недопустимо) и мягкое (soft real-time — опоздания допустимы, но снижают качество). Примеры: VxWorks, QNX, RT-Linux.
  • Планирование общего назначения — стремится к балансу между пропускной способностью, временем отклика и справедливостью. Примеры: CFS (Linux), планировщик Windows NT.

Основные алгоритмы планирования

First-Come, First-Served (FCFS)

Простейший алгоритм — первый пришедший процесс получает процессор первым и работает до завершения. Недостаток: эффект «конвоя» — короткие задачи ждут длинных. Реализован в пакетных системах 1960-х годов.

Shortest Job First (SJF)

Выбирает процесс с наименьшим оставшимся временем выполнения. Теоретически оптимален по среднему времени ожидания, но на практике требует априорного знания длительности процессов. Используется в специализированных системах планирования задач.

Round Robin (RR)

Каждому процессу выделяется фиксированный квант времени (обычно 10–100 мс). После его истечения процесс перемещается в конец очереди. Базовая реализация — циклическая очередь. Применяется в ядре Linux для задач реального времени (SCHED_RR).

Priority Scheduling

Процессы получают приоритеты; планировщик всегда выбирает процесс с наивысшим приоритетом. Для предотвращения «голодания» низкоприоритетных задач используется старение (aging) — постепенное повышение приоритета ожидающих процессов. Реализован в Windows (32 уровня приоритета) и Linux (140 уровней).

Completely Fair Scheduler (CFS)

Алгоритм, принятый в ядре Linux с версии 2.6.23 (2007 год). Вместо очередей использует красно-чёрное дерево, где каждый процесс представлен виртуальным временем выполнения. Планировщик выбирает процесс с минимальным виртуальным временем, обеспечивая почти идеальную справедливость. Поддерживает симметричную многопроцессорность и энергосбережение.

Многоуровневая очередь с обратной связью (MLFQ)

Процессы распределяются по нескольким очередям с разными приоритетами и квантами времени. Если процесс не завершается за квант, он понижается в очереди. Интерактивные процессы (короткие прерывания) остаются в верхних очередях, получая быстрый отклик. Реализован в Windows NT и macOS.

Устройство и компоненты планировщика

Диспетчер (dispatcher)

Модуль, непосредственно выполняющий переключение контекста: сохранение состояния текущего процесса (регистры, счётчик команд) и загрузка состояния нового. Время переключения контекста — критический параметр (обычно 1–10 микросекунд).

Очереди процессов

  • Очередь готовности — процессы, ожидающие выделения ЦП.
  • Очередь блокировки — процессы, ожидающие завершения операции ввода-вывода или получения ресурса.
  • Очередь завершения — процессы, завершившие выполнение.

Таймер прерываний

Аппаратный таймер (например, Intel 8254 или HPET) генерирует прерывания через заданные интервалы (тики). Планировщик обрабатывает каждое прерывание, проверяя, не истёк ли квант времени текущего процесса. В современных ОС (Linux с ядром 3.x+) тики могут быть динамическими (tickless) для экономии энергии.

Планировочные политики

В каждой ОС реализован набор политик, определяющих поведение планировщика для разных типов задач:

  • SCHED_OTHER (Linux) — стандартная политика для обычных процессов.
  • SCHED_FIFO — политика реального времени с первой очередью.
  • SCHED_RR — политика реального времени с циклическим переключением.
  • Windows — классы приоритетов (Idle, Below Normal, Normal, Above Normal, High, Realtime).

Применение в различных операционных системах

Linux

Ядро Linux использует CFS как планировщик по умолчанию с 2007 года. Для задач реального времени доступны SCHED_FIFO и SCHED_RR. Поддерживается привязка процессов к конкретным ядрам (CPU affinity). Планировщик учитывает архитектуру NUMA (неравномерный доступ к памяти) для минимизации задержек доступа.

Windows

Планировщик Windows (начиная с Windows NT 3.1) основан на 32-уровневой приоритетной модели с динамическим повышением приоритета для интерактивных процессов (например, при нажатии клавиш). Используется вытесняющее планирование с квантом времени 20–120 мс (зависит от версии и конфигурации). Поддерживает гибридную архитектуру (Thread Scheduling).

macOS

Планировщик macOS (XNU) сочетает элементы Mach и BSD. Используется многоуровневая очередь с обратной связью (MLFQ) с 4 приоритетными уровнями. Особое внимание уделяется энергоэффективности на мобильных устройствах (MacBook, iPad). С 2020 года поддерживает планирование для архитектуры Apple Silicon (M1, M2).

Встраиваемые системы (RTOS)

В операционных системах реального времени (FreeRTOS, VxWorks, QNX) планировщик гарантирует детерминированное время отклика. Используются алгоритмы Rate-Monotonic Scheduling (RMS) и Earliest Deadline First (EDF). Квант времени часто отсутствует — задачи работают до завершения или до блокировки.

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

Проблема инверсии приоритетов

Возникает, когда высокоприоритетный процесс ожидает ресурса, занятого низкоприоритетным, который, в свою очередь, вытесняется средним приоритетом. Решение — протоколы наследования приоритетов (Priority Inheritance Protocol), реализованные в VxWorks и Linux (RT-mutex).

Энергопотребление

Современные планировщики сталкиваются с дилеммой: высокая частота переключений контекста увеличивает отзывчивость, но повышает энергопотребление. В мобильных ОС (Android, iOS) применяются алгоритмы, снижающие частоту тиков таймера и объединяющие короткие простаивающие периоды (tickless idle).

Масштабирование на многоядерные системы

На системах с десятками ядер (например, AMD EPYC, Intel Xeon) планировщик должен минимизировать миграцию процессов между ядрами (cache thrashing) и учитывать топологию кэша. В Linux для этого используется группа планирования (scheduling domain) и алгоритм load balancing.

Виртуализация

В виртуальных средах (KVM, VMware, Hyper-V) планировщик гостевой ОС не имеет прямого доступа к аппаратному таймеру, что может приводить к временны́м искажениям. Для решения применяется паравиртуализация таймера и механизмы steal time (учёт времени, украденного гипервизором).

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

  • Первый вытесняющий планировщик был реализован в операционной системе CTSS (1961 год) Массачусетского технологического института.
  • В ядре Linux версии 2.4 (2001 год) использовался алгоритм O(n) — планировщик просматривал все процессы в очереди, что замедляло работу на многопроцессорных системах. С версии 2.5 (2003 год) был внедрён O(1) планировщик.
  • Планировщик Windows XP (2001 год) имел ошибку, из-за которой процессы с приоритетом «Realtime» могли заблокировать мышь и клавиатуру — это было исправлено в Windows Vista.
  • В 2010 году в ядро Linux был добавлен планировщик BFS (Brain Fuck Scheduler) как альтернатива CFS, ориентированный на десктопные системы с малым числом ядер.
  • В операционной системе QNX (используется в автомобильной электронике и медицинском оборудовании) планировщик гарантирует время переключения контекста менее 1 микросекунды.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015)
  • Лав Р. «Ядро Linux. Описание процесса разработки» (3-е издание, 2010)
  • Silberschatz A., Galvin P., Gagne G. «Operating System Concepts» (10th edition, 2018)
  • Документация ядра Linux: «Documentation/scheduler/sched-design-CFS.txt»
  • Microsoft Docs: «Windows Kernel-Mode Scheduler» (2023)
  • Stallings W. «Operating Systems: Internals and Design Principles» (9th edition, 2017)

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

На главную BFOmetr →