#linux #linux-kernel #scheduler
#linux #linux-ядро #планировщик
Вопрос:
Я новичок в ядре Linux, и я пытаюсь узнать, как Linux планирует процессы.
Я прочитал несколько книг по ядру Linux и просмотрел ссылки от IBM http://www.ibm.com/developerworks/linux/library/l-cfs / и все, но у меня все еще остаются некоторые сомнения.
- Как планировщик планирует все задачи в течение
sysctl_sched_latency
времени? - Когда процесс просыпается, что на самом деле делается в
place_entity
функции? - Почему, когда процесс просыпается,
vruntime
корректируется путем вычитания изsched_latency
? Не может ли это привести к процессам в очереди запуска с большими различиями вvruntime
значении?
Комментарии:
1. Что касается вашего первого вопроса — От oakbytes.wordpress.com/2012/06/06 /… : Если количество выполняемых задач не превышает sched_latency_ns/sched_min_granularity_ns период планирования = sched_latency_ns другой период планирования = number_of_running_tasks * sched_min_granularity_ns
Ответ №1:
Во-первых, виртуальное время выполнения задачи
- теоретически это время, когда задача начнет свой следующий этап выполнения на теоретически идеальном многопоточном процессоре.
- на практике его фактическое время выполнения нормализуется до общего количества запущенных задач
1. Как планировщик планирует все задачи в течение времени sysctl_sched_latency?
Он поддерживает упорядоченное по времени красное и черное дерево, где все выполняемые задачи отсортированы по их виртуальному времени выполнения. Узлы слева работают в течение наименьшего промежутка времени. CFS выбирает самую левую задачу и запускает ее до тех пор, пока не будет установлено расписание задач или планировщик не отметит галочку, после чего время процессора, затраченное на выполнение, добавляется к его виртуальной среде выполнения. Когда он больше не является самым левым узлом, запускается новая задача с самым коротким виртуальным, а старая задача предварительно выполняется.
2. Когда процесс просыпается, что на самом деле делается в функции place_entity?
Краткая версия:
Когда процесс пробуждается, функция place_entity либо оставляет виртуальное время выполнения задачи таким, каким оно было, либо увеличивает его.
Длинная версия:
Когда процесс пробуждается, функция place_entity выполняет следующие действия
-
Инициализируйте временную виртуальную среду выполнения в виртуальной среде выполнения очереди запуска CFS для самой маленькой задачи.
-
Поскольку время ожидания меньше одной задержки не учитывается, инициализирует пороговую переменную в sysctl_sched_latency. Если включена функция GENTLE_FAIR_SLEEPERS, то значение переменной this составляет половину. Уменьшите ранее инициализированную временную виртуальную среду выполнения на это пороговое значение.
-
Убедитесь, что временная виртуальная среда выполнения, по крайней мере, равна виртуальной среде выполнения задачи, установив вычисляемую виртуальную среду выполнения на максимум для себя и виртуальной среды выполнения задачи.
-
Установите виртуальную среду выполнения задачи на временную среду выполнения.
3. Когда процесс просыпается, почему время выполнения корректируется путем вычитания из sched_latency?
Виртуальная среда выполнения уменьшается, потому что время ожидания меньше одной задержки не учитывается. Например, задача не должна менять свою позицию в красно-черном дереве, если она перешла в режим ожидания только для одной задержки планировщика.
4. Не может ли это привести к процессам в очереди запуска с большими различиями в значении vruntime?
Я считаю, что логика, описанная на шаге 3 для вопроса 2, предотвращает или, по крайней мере, сводит к минимуму это.
Ссылки
Комментарии:
1. Ответ на вопрос 1 на самом деле не дает ответа о планировании CFS внутри
sysctl_sched_latency
.2. Извините, но я действительно не могу понять приведенное объяснение: «теоретически, когда задача начнет следующий этап выполнения на теоретически идеальном многопоточном процессоре»., не должен ли идеальный многопоточный процессор просто запускать все процессы одновременно? Ваша последняя ссылка очень точно описывает такую машину как «»Идеальный многозадачный процессор» — это (несуществующий :-)) процессор, который обладает 100% физической мощностью и который может выполнять каждую задачу с точно одинаковой скоростью, параллельно, каждая со скоростью 1 / nr_running». По этому определению концепция временного интервала даже не имеет смысла.
3. Кстати, я также обнаружил, что статья «Примечания к дизайну планировщика CFS» особенно плохо сформулирована, обратите внимание, что 3-й и 4-й абзацы полностью противоречат друг другу (!)