Планировщик процессов — одна из важнейших подсистем ядра Linux. Именно он определяет, какой поток получит процессорное время в каждый конкретный момент. Несмотря на многоядерность современных компьютеров, количество одновременно выполняемых задач практически всегда значительно превышает доступные вычислительные ресурсы. Поэтому ядру необходимо постоянно принимать решения о распределении процессорного времени между задачами.
Привет! Я Никита, разработчик системного ПО в Selectel. В этой статье рассмотрим эволюцию трех наиболее известных планировщиков Linux: O(1), CFS (Completely Fair Scheduler) и EEVDF (Earliest Eligible Virtual Deadline First).
Внутри Linux объектом планирования является не процесс как таковой, а задача, представленная структурой task_struct. Она может соответствовать как отдельному процессу, так и потоку выполнения. Все готовые к выполнению задачи помещаются в специальные очереди, из которых планировщик выбирает следующую.
Для каждого процессорного ядра Linux поддерживает собственную очередь выполнения — runqueue. Такое решение позволяет ядрам независимо выбирать следующую задачу, что уменьшает конкуренцию за общие структуры данных и повышает масштабируемость системы. Если одно ядро оказывается перегружено, а другое простаивает, механизм балансировки нагрузки переносит задачи между очередями.