CFS - многопоточный планировщик Linux

Планирование в Linux

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

CFS предназначен для интерактивных приложений, типичных для среды настольных компьютеров, но его можно настроить как SCHED_BATCH, чтобы использовать пакетные рабочие нагрузки, типичные, например, для большого объема веб-сервера. В любом случае, CFS нарушает то, что можно назвать "классическим упреждающим планированием". Кроме того, "абсолютно справедливая" претензия должна рассматриваться технически; в противном случае заявление может показаться пустым хвастовством.

Давайте углубимся в детали того, что отличает CFS от других планировщиков процессов. Начнем с краткого обзора некоторых основных технических терминов.

Основные концепции

Некоторые основные концепции Linux наследуют представление Unix процесса как выполняемой программы. Таким образом, процесс должен конкурировать с другими процессами за общие системные ресурсы: память для хранения инструкций и данных, как минимум один процессор для выполнения инструкций и устройства ввода-вывода для взаимодействия с внешним миром. Планирование процессов – это то, как операционная система (ОС) назначает задачи (например, обрабатывает некоторые числа, копирует файл) процессорам, после чего выполняемый процесс выполняет задачу. Процесс имеет один или несколько потоков выполнения, которые являются последовательностями инструкций машинного уровня. Планирование процесса означает планирование одного из его потоков на процессоре.

В упрощенном порядке Linux превращает планирование процессов в планирование потоков, обрабатывая запланированный процесс, как если бы он был однопоточным. Если процесс является многопоточным с N потоками, то для покрытия потоков потребуется N действий планирования. Потоки в многопоточном процессе остаются связанными в том смысле, что они совместно используют ресурсы, такие как адресное пространство памяти. Потоки Linux иногда называют легковесными процессами, при этом легковесность подчеркивает разделение ресурсов между потоками внутри процесса.

Хотя процесс может находиться в разных состояниях, два из них представляют особый интерес при планировании. Заблокированный процесс ожидает завершения какого-либо события, например, события ввода-вывода. Процесс может возобновить выполнение только после завершения события. Работающий процесс – это тот, который в настоящее время не заблокирован.

Процесс привязан к процессору (он же связан с вычислениями), если он потребляет в основном ресурсы процессора, а не ресурсы ввода/вывода, и связан с вводом-выводом в противоположном случае; следовательно, связанный с процессором процесс в основном выполняется, тогда как связанный с вводом/выводом процесс в основном блокируется. В качестве примеров, сжатие чисел связано с процессором, а доступ к файлам связан с вводом/выводом. Хотя весь процесс может быть охарактеризован как связанный с процессором или связанный с вводом/выводом, данный процесс может быть одним или другим на разных этапах его выполнения. Интерактивные настольные приложения, такие как браузеры, обычно связаны с вводом/выводом.

Хороший планировщик процессов должен сбалансировать потребности задач, связанных с процессором и вводом-выводом, особенно в операционной системе, такой как Linux, которая процветает на стольких аппаратных платформах: настольные машины, встроенные устройства, мобильные устройства, кластеры серверов, суперкомпьютеры и др.

Классическое упреждающее планирование по сравнению с CFS

Unix популяризировал классическое упреждающее планирование, которое впоследствии приняли другие операционные системы, включая VAX/VMS, Windows NT и Linux. В центре этой модели планирования находится фиксированный временной интервал – количество времени (например, 50 мс), в течение которого задаче разрешается удерживать процессор до тех пор, пока она не будет прервана в пользу какой-либо другой задачи. Если прерванный процесс не завершил свою работу, процесс должен быть перенесен. Эта модель хороша тем, что поддерживает многозадачность (параллелизм) за счет разделения времени процессора (даже на однопроцессорных компьютерах прошлых лет).

Классическая модель обычно включает в себя несколько очередей планирования, по одной на приоритет процесса: каждый процесс в очереди с более высоким приоритетом планируется перед любым процессом в очереди с более низким приоритетом. Например, VAX/VMS использует 32 очереди с приоритетами для планирования.

CFS обходится без фиксированных временных интервалов и явных приоритетов. Количество времени для выполнения определенной задачи на процессоре вычисляется динамически по мере изменения контекста планирования в течение срока службы системы. Вот эскиз мотивирующих идей и технических деталей:

  • Представьте себе процессор P, который идеально подходит для выполнения нескольких задач одновременно. Например, задачи T1 и T2 могут выполняться на P одновременно, при этом каждая получает 50% магической вычислительной мощности P. Эта идеализация описывает идеальную многозадачность, которую CFS стремится достичь на реальных, а не идеализированных процессорах. CFS разработан, чтобы приблизиться к идеальной многозадачности.
  • Планировщик CFS имеет целевую задержку, которая представляет собой минимальное количество времени (идеализированное на бесконечно малую продолжительность), необходимое для каждой выполняемой задачи, чтобы получить хотя бы один оборот процессора. Если бы такая длительность могла быть бесконечно малой, то каждая выполняемая задача включала бы процессор в течение любого заданного промежутка времени, как бы он ни был мал (например, 10 мс, 5 нс и т. д.). Конечно, идеализированная бесконечно малая длительность должна быть аппроксимирована в реальном мире, и приблизительное значение по умолчанию составляет 20 мс. Каждая выполняемая задача затем получает 1/N кусок целевой задержки, где N – количество задач. Например, если целевая задержка составляет 20 мс и существует четыре конкурирующих задачи, то каждая задача получает временной интервал 5 мс. Кстати, если во время события планирования есть только одна задача, эта везучая задача получает всю задержку в качестве своей части. Доля в CFS выходит на первый план в срезе 1/N, который дается каждой задаче, претендующей на процессор.
  • Срез 1/N, действительно, является временным срезом, но не фиксированным, поскольку такой срез зависит от N (количества задач) в настоящее время конкурирующих за процессор. Система меняется со временем. Некоторые процессы завершаются и появляются новые; работающие процессы блокируются, а заблокированные процессы становятся работоспособными. Значение N является динамическим и, следовательно, является временным интервалом 1/N, вычисленным для каждой выполняемой задачи, конкурирующей за процессор. Традиционное значение nice используется для взвешивания среза 1/N: значение nice с низким приоритетом означает, что только некоторая часть среза 1/N отдается задаче, тогда как значение nice с высоким приоритетом означает, что пропорционально большая доля часть 1/N дается задаче. Таким образом, хорошие значения не определяют срез, а только изменяют срез 1/N, который представляет справедливость среди конкурирующих задач.
  • Операционная система несет издержки всякий раз, когда происходит переключение контекста; то есть, когда один процесс выгружается в пользу другого. Чтобы эти накладные расходы не становились чрезмерно большими, существует минимальный промежуток времени (с типичной настройкой от 1 мс до 4 мс), который должен выполнять любой запланированный процесс, прежде чем он будет прерван. Этот минимум известен как минимальная гранулярность. Если многие задачи (например, 20) конкурируют за процессор, то минимальная гранулярность (предположим, 4 мс) может быть больше, чем срез 1/N (в данном случае 1 мс). Если минимальная гранулярность оказывается больше, чем срез 1/N, система будет перегружена из-за слишком большого количества задач, конкурирующих за процессор.
Наверх
Меню