В Linux v2.6.23 был интегрирован новый планировщик CFS , который меньше полагается на HZ
и больше на наносекунды времени выполнения.
Все процессы хранятся в красно-черном дереве , что удешевляет O (1) , чтобы найти самую левую (и, следовательно, самую достойную) задачу для выполнения. Периодически (task_tick()
) система проверяет, может ли другой процесс быть «более заслуживающим внимания», и опережает выполнение задачи. (Конечно, задачи могут выдавать (yield_task()
) самостоятельно, а вновь запускаемые задачи могут вытеснять запущенную задачу (check_preempt_curr()
). Время, затраченное на выполнение процесса, учитывается и снова вставляется в дерево. O (log (N)) , чтобы найти новое место размещения в дереве RB.
Таким образом, задачи, ожидающие ввода-вывода, учитываются очень мало времени и не перемещаются очень далеко в дереве - что соответствует повышению приоритета. Задачи, которые не спят в событии ввода-вывода, будут использовать сравнительно больше процессорного времени, прежде чем они будут вытеснены задачей с более высоким приоритетом.
Для получения более подробной информации обязательно прочитайте документацию Documentation/scheduler/
и файлы реализации kernel/sched*
.
Если бы это был мой домашний проект, чтобы поиграть с планировщиками (как это было принято в старину), я бы серьезно отнесся к добавлению нового класса планирования в реальном времени, например SCHED_FIFO
или SCHED_RR
(в зависимости от того, какой ближе к планированию планировщика, о котором идет речь, и таким образом возиться с приоритетами задач. Это может быть немного круто для вводного курса по ОС, чтобы сделать это - с более старым ядром Linux или более старым BSD можно было бы легче играть.