Введение

Планировщик процессов ядра Linux 2.6

Планировщик O(1) (произносится как "O от 1", "Большой O от 1" или "планировщик с постоянным временем") — это архитектура планирования ядра, способная планировать процессы за постоянное время, независимо от количества запущенных в операционной системе процессов. Это улучшение по сравнению с ранее использовавшимися планировщиками O(n), время работы которых масштабируется линейно в зависимости от количества процессов. В области операционных систем реального времени ключевым является детерминированное выполнение, и планировщик O(1) способен предоставлять услуги планирования с фиксированной верхней границей времени выполнения. Планировщик O(1) использовался в версиях Linux 2.6.0 – 2.6.22 (2003–2007), после чего был заменен на Completely Fair Scheduler (Полностью справедливый планировщик).

Обзор

Linux scheduler был полностью переработан с выпуском ядра 2.6 в 2003 году. Новый планировщик получил название O(1)-планировщик. Алгоритм, используемый O(1)-планировщиком, основывается на активных и просроченных массивах процессов для достижения постоянного времени планирования. Каждому процессу выделяется фиксированный квант времени, после чего он прерывается и перемещается в просроченный массив. Когда все задачи из активного массива исчерпывают свой квант времени и перемещаются в просроченный массив, происходит переключение массивов. Поскольку доступ к массивам осуществляется только через указатели, переключение происходит так же быстро, как обмен двумя указателями. Это переключение делает активный массив новым пустым просроченным массивом, а просроченный массив становится активным.

О O(1) обозначении

Алгоритм оперирует с входными данными, и размер этих данных обычно определяет время его выполнения. Нотация «Большое О» используется для обозначения скорости роста времени выполнения алгоритма в зависимости от объема входных данных. Например, время выполнения алгоритма O(n) увеличивается линейно с ростом размера входных данных n. Время выполнения алгоритма O(n²) растет квадратично. Если возможно установить постоянную верхнюю границу времени выполнения алгоритма, он считается O(1) (можно сказать, что он выполняется за «постоянное время»). То есть, алгоритм O(1) гарантированно завершается за определенное время, независимо от размера входных данных.

Улучшение производительности планировщика Linux

Планировщик Linux 2.6.8.1 не содержал алгоритмов, время выполнения которых превышало бы O(1). То есть, каждая часть планировщика гарантированно выполняется за определенное постоянное время, независимо от количества задач в системе. Это позволяет ядру Linux эффективно обрабатывать огромное число задач без увеличения накладных расходов по мере их роста. В планировщике Linux 2.6.8.1 две ключевые структуры данных обеспечивают выполнение задач за время O(1), и вокруг них строится вся его конструкция: очереди выполнения и массивы приоритетов.

Проблемы

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

Замена

В версии 2.6.23 (октябрь 2007 года) был представлен Полностью Справедливый Планировщик, заменивший планировщик O(1). По словам Инго Молнара, автора CFS, основная идея его разработки может быть выражена одним предложением: "CFS по сути моделирует 'идеальный, точный многозадачный процессор' на реальном аппаратном обеспечении".