Подтвердить что ты не робот

Задержка Linux CFS (полностью справедливый планировщик)

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

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

  • Как планировщик расписал все задачи в течение sysctl_sched_latency?
  • Когда процесс просыпается, что фактически сделано в функции place_entity?
  • Когда процесс просыпается, почему vruntime скорректирован путем вычитания из sched_latency? Не может ли это привести к процессам в очереди выполнения с большими отличиями в значении vruntime?
4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ссылки

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

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

Примечания к дизайну планировщика CFS