Linux CFS (полностью честный планировщик) задержка - PullRequest
13 голосов
/ 05 ноября 2011

Я новичок в ядре Linux и пытаюсь узнать, как Linux планирует процессы.

Я прочитал несколько книг по ядру Linux и просмотрел ссылки из IBM http://www.ibm.com/developerworks/linux/library/l-cfs/ и все, но у меня все еще остаются некоторые сомнения.

  1. Как планировщик планирует все задачи за sysctl_sched_latency время?
  2. Когда процесс просыпается, что на самом деле делается в функции place_entity?
  3. Когда процесс просыпается, почему vruntime корректируется путем вычитания из sched_latency? Разве это не может привести к процессам в очереди выполнения с большими различиями в значении vruntime?

1 Ответ

10 голосов
/ 10 февраля 2012

Во-первых, виртуальное время выполнения задачи

  • в теории - это время, когда задача запускает свой следующий отрезок времени на теоретически совершенном многопоточном ЦП.
  • на практикеэто фактическое время выполнения, нормализованное к общему количеству запущенных задач

1.Как планировщик планирует все задачи в течение времени sysctl_sched_latency?

Он поддерживает упорядоченное по времени красное и черное дерево, где все выполняемые задачи сортируются по их виртуальному времени выполнения.Узлы слева работали в течение кратчайшего времени.CFS выбирает крайнюю левую задачу и запускает ее до тех пор, пока задача не запланирована или планировщик не помечен, затем время ЦП, которое он провел, добавляется к его виртуальной среде выполнения.Когда он больше не является самым левым узлом, запускается новая задача с самой короткой виртуальной машиной, а старая задача выгружается.

2.Когда процесс просыпается, что на самом деле делается в функции place_entity?

Краткая версия:

Когда процесс активируется, функция place_entity либо покидает задачувиртуальная среда выполнения как есть или увеличивается.

Длинная версия:

Когда процесс активизируется, функция place_entity выполняет следующие действия

  1. Инициализирует временную виртуальную среду выполненияк виртуальной среде выполнения очереди выполнения CFS для самой маленькой задачи.

  2. Поскольку количество снов меньше одной задержки не учитывается, инициализируется пороговая переменная для sysctl_sched_latency.Если функция GENTLE_FAIR_SLEEPERS включена, тогда половина значения этой переменной.Уменьшите ранее инициализированное временное виртуальное время выполнения на это пороговое значение.

  3. Убедитесь, что временное виртуальное время выполнения, по крайней мере, равно виртуальному времени выполнения задачи, задав для вычисленного виртуального времени выполнения максимальное значение:сама и виртуальная среда выполнения задачи.

  4. Установите виртуальную среду выполнения задачи на временную среду выполнения.

3.Когда процесс просыпается, почему время vruntime корректируется путем вычитания из sched_latency?

Виртуальное время выполнения уменьшается, поскольку спящие меньше одной задержки не учитываются.Например, задача не должна менять свою позицию в красном черном дереве, если она спала только для одной задержки планировщика.

4.Разве это не может привести к процессам в очереди выполнения с большими различиями в значении vruntime?

Я считаю, что логика, описанная в шаге 3 для вопроса 2, предотвращает или, по крайней мере, минимизирует это.

Ссылки

sched.c Источник ядра Linux

sched_fair.c Источник ядра Linux

Замечания по проектированию планировщика CFS

...