В Linux существует несколько ключевых алгоритмов планирования ресурсов, которые можно разделить на две основные категории: планировщики процессов (CPU) и планировщики ввода-вывода (I/O). Рассмотрим их подробно.
1. Планировщики процессов
Completely Fair Scheduler
- Описание: Основной планировщик процессов в Linux с 2007 года (начиная с ядра 2.6.23). CFS использует концепцию "виртуального времени" для обеспечения справедливого распределения CPU между процессами.
- Принцип работы:
- Каждому процессу выделяется "квант времени" в зависимости от его приоритета (nice value).
- CFS использует красно-черное дерево для отслеживания процессов, сортируя их по виртуальному времени выполнения.
- Ключевые параметры:
sched_latency
— период, за который все задачи должны получить CPU.
min_granularity
— минимальный квант времени для задачи.
Пример настройки приоритета (nice value):
nice -n 10 ./script.sh # Запуск с низким приоритетом
O Scheduler
- Описание: Использовался до CFS (в ядрах 2.6). Назван так из-за сложности O(1) для операций вставки и выбора задачи.
- Особенности:
- Использовал две очереди: активную и экспирированную.
- Поддерживал интерактивные задачи, но был менее предсказуем, чем CFS.
Real-Time Schedulers
Для задач реального времени (RT) в Linux есть два алгоритма:
- SCHED_FIFO (First-In-First-Out):
- Задачи выполняются строго по очереди, пока не освободят CPU.
- Приоритет статичен (от 1 до 99, где 99 — наивысший).
- SCHED_RR (Round Robin):
- Как FIFO, но с квантованием времени для задач с одинаковым приоритетом.
Пример установки RT-приоритета:
struct sched_param param;
param.sched_priority = 50;
sched_setscheduler(pid, SCHED_FIFO, ¶m);
2. Планировщики ввода-вывода
CFQ
- Описание: Стандартный планировщик для HDD. Создает отдельные очереди для каждого процесса.
- Плюсы: Справедливо распределяет ресурсы между задачами.
- Минусы: Неэффективен для SSD.
Deadline
- Описание: Обеспечивает минимальную задержку для операций I/O.
- Особенности:
- Использует три очереди: read FIFO, write FIFO и сортированную.
- Гарантирует, что запросы не будут ждать дольше заданного времени.
NOOP
- Описание: Простейший планировщик, работающий по принципу FIFO.
- Использование: Оптимален для SSD, где аппаратная очередь уже эффективна.
Kyber
- Описание: Современный планировщик для быстрых устройств (NVMe, SSD).
- Особенности:
- Управляет двумя очередями: синхронных и асинхронных запросов.
- Поддерживает "бюджеты" для ограничения задержек.
Пример смены I/O-планировщика:
echo deadline > /sys/block/sda/queue/scheduler
3. Дополнительные механизмы
- cgroups: Позволяют ограничивать ресурсы (CPU, I/O, память) для групп процессов.
- CPU Affinity: Закрепление процессов за определенными ядрами CPU.
- Energy-Aware Scheduling (EAS): В мобильных и embedded-системах для оптимизации энергопотребления.
Резюмируем:
- Для CPU: CFS (основной), O(1) (устарел), SCHED_FIFO/SCHED_RR (реальное время).
- Для I/O: CFQ (HDD), Deadline (универсальный), NOOP (SSD), Kyber (NVMe).
- Дополнительно: cgroups, CPU affinity, EAS.