stringtranslate.com

Полностью честный планировщик

Расположение «Completely Fair Scheduler» (планировщика процессов) в упрощенной структуре ядра Linux.

Completely Fair Scheduler ( CFS ) был планировщиком процессов , который был объединен с выпуском 2.6.23 (октябрь 2007 г.) ядра Linux . Он был планировщиком по умолчанию для задач класса (т. е. задач, не имеющих ограничений на выполнение в реальном времени) и управлял распределением ресурсов ЦП для выполнения процессов , стремясь максимизировать общее использование ЦП, а также максимизировать интерактивную производительность.SCHED_NORMAL

В отличие от предыдущего планировщика O(1) , использовавшегося в старых ядрах Linux 2.6, который поддерживал и переключал очереди выполнения активных и просроченных задач, реализация планировщика CFS основана на очередях выполнения по ЦП, узлы которых являются упорядоченными по времени планируемыми сущностями, которые хранятся отсортированными по красно-черным деревьям . CFS устраняет старое понятие фиксированных временных срезов по приоритетам и вместо этого стремится отдать справедливую долю времени ЦП задачам (или, лучше, планируемым сущностям). [1] [2]

Начиная с версии 6.6 ядра Linux его заменил планировщик EEVDF .

Алгоритм

Задача (т. е. синоним потока) — это минимальная сущность, которую Linux может планировать. Однако он также может управлять группами потоков, целыми многопоточными процессами и даже всеми процессами данного пользователя. Такая конструкция приводит к концепции планируемых сущностей, где задачи группируются и управляются планировщиком как единое целое. Чтобы эта конструкция работала, каждый task_structдескриптор задачи встраивает поле типа sched_entity, представляющее набор сущностей, к которым принадлежит задача.

Каждая очередь выполнения по ЦП типа cfs_rqсортирует sched_entityструктуры в упорядоченном по времени виде в красно-черное дерево (или 'rbtree' на жаргоне Linux), где самый левый узел занят сущностью, которая получила наименьший отрезок времени выполнения (который сохраняется в поле vruntimeсущности). Узлы индексируются по " времени выполнения " процессора в наносекундах. [3]

Для каждого процесса также рассчитывается " максимальное время выполнения ", представляющее время, которое процесс ожидал бы для выполнения на "идеальном процессоре". Это время, которое процесс ожидал выполнения, деленное на общее количество процессов.

Когда планировщик вызывается для запуска нового процесса:

  1. Выбирается самый левый узел дерева планирования (так как он будет иметь наименьшее затраченное время выполнения ) и отправляется на выполнение.
  2. Если процесс просто завершает выполнение, он удаляется из системы и дерева планирования.
  3. Если процесс достигает максимального времени выполнения или иным образом останавливается (добровольно или посредством прерывания), он повторно вставляется в дерево планирования на основе вновь затраченного времени выполнения .
  4. Затем из дерева будет выбран новый самый левый узел, и итерация повторится.

Если процесс проводит много времени в состоянии сна, то его затраченное время невелико, и он автоматически получает повышение приоритета, когда оно ему наконец понадобится. Следовательно, такие задачи не получают меньше процессорного времени, чем задачи, которые постоянно выполняются.

Сложность алгоритма, который вставляет узлы в cfs_rqочередь выполнения планировщика CFS, составляет O ( log N ), где N — общее количество сущностей. Выбор следующей сущности для выполнения выполняется за постоянное время, поскольку самый левый узел всегда кэшируется.

История

Работа Кона Коливаса с планированием, наиболее значительная из его реализации « справедливого планирования » под названием Rotating Staircase Deadline , вдохновила Инго Молнара на разработку своего CFS в качестве замены более раннего планировщика O(1) , в объявлении которого он упомянул Коливаса. [4] CFS — это реализация хорошо изученного классического алгоритма планирования, называемого взвешенной справедливой очередью . [5] Первоначально изобретенная для пакетных сетей , справедливая очередь ранее применялась к планированию ЦП под названием stride scheduling . CFS — это первая реализация планировщика процесса справедливой очереди , широко используемая в операционной системе общего назначения. [5]

Ядро Linux получило патч для CFS в ноябре 2010 года для ядра 2.6.38, который сделал планировщик «более справедливым» для использования на настольных компьютерах и рабочих станциях. Разработанный Майком Гэлбрейтом с использованием идей, предложенных Линусом Торвальдсом , патч реализует функцию, называемую автоматической группировкой, которая значительно повышает производительность интерактивного рабочего стола. [6] Алгоритм помещает родительские процессы в ту же группу задач, что и дочерние процессы. [7] (Группы задач привязаны к сеансам, созданным с помощью системного вызова setsid(). [8] ) Это решило проблему медленного времени интерактивного отклика в многоядерных и многопроцессорных ( SMP ) системах, когда они выполняли другие задачи, использующие много потоков, интенсивно использующих процессор. Простое объяснение заключается в том, что с применением этого патча можно по-прежнему смотреть видео, читать электронную почту и выполнять другие типичные действия на рабочем столе без сбоев или прерываний, например, при компиляции ядра Linux или кодировании видео.

В 2016 году планировщик Linux был исправлен для улучшения многоядерной производительности на основе предложений, изложенных в статье «Планировщик Linux: десятилетие бесполезной траты ядер» [9] .

В 2023 году новый планировщик, основанный на раннем подходящем виртуальном крайнем сроке первого планирования (EEVDF), был подготовлен для замены CFS. [10] Мотивацией было устранение необходимости в исправлениях CFS «latency nice». [11]

Смотрите также

Ссылки

  1. ^ Лав, Роберт (2010). Разработка ядра Linux (3-е изд.). Соединенные Штаты Америки: Addison Wesley. стр. 41–61. ISBN 9780672329463.
  2. ^ "Linux: The Completely Fair Scheduler | KernelTrap". 2007-04-19. Архивировано из оригинала 2007-04-19 . Получено 2021-05-16 .
  3. ^ "IBM Developer". developer.ibm.com . Получено 25 мая 2024 г. .
  4. ^ Молнар, Инго (13.04.2007). "[патч] Модульное ядро ​​планировщика и полностью честный планировщик [CFS]". linux-kernel (список рассылки).
  5. ^ ab Li, T.; Baumberger, D.; Hahn, S. (2009). «Эффективное и масштабируемое многопроцессорное справедливое планирование с использованием распределенного взвешенного циклического алгоритма» (PDF) . Уведомления ACM SIGPLAN . 44 (4): 65. CiteSeerX 10.1.1.567.2170 . doi :10.1145/1594835.1504188. 
  6. ^ ~200-строчный патч ядра Linux, который творит чудеса
  7. ^ Гэлбрейт, Майк (15.11.2010). "[RFC/RFT PATCH v3] Re: [RFC/RFT PATCH v3] sched: автоматизированные группы задач для каждого терминала [CFS]". linux-kernel (список рассылки).
  8. ^ Гэлбрейт, Майк (2010-11-20). "[PATCH v4] sched: автоматизированные группы задач для каждого сеанса". linux-kernel (список рассылки).
  9. ^ Лози, Жан-Пьер; Леперс, Батист; Фанстон, Джастин; Год, Фабьен; Куема, Вивиан; Федорова, Александра. «Планировщик Linux: десятилетие траты ядер впустую» (PDF) . EuroSys 2016. doi :10.1145/2901318.2901326 . Получено 15 июня 2019 г. .
  10. ^ "Планировщик EEVDF может быть готов к выпуску в Linux 6.6". www.phoronix.com . Получено 27.07.2023 .
  11. ^ "Планировщик ЦП EEVDF для Linux [LWN.net]". lwn.net . Получено 2023-07-27 .

Внешние ссылки