Я пытаюсь понять, как работает процесс расписания в ядре linux. Мой вопрос заключается не в алгоритме планирования. О том, как работают функции schedule()
и switch_to()
.
Я попытаюсь объяснить. Я видел это:
Когда процесс заканчивается срезом времени, флаг need_resched
устанавливается scheduler_tick()
. Ядро проверяет флаг, видит, что он установлен, и вызывает schedule()
(относящийся к вопросу 1), чтобы переключиться на новый процесс. Этот флаг является сообщением о том, что расписание должно быть вызвано как можно скорее, потому что другой процесс заслуживает запуска.
По возвращении в пользовательское пространство или возврату из прерывания проверяется флаг need_resched
. Если он установлен, ядро запускает планировщик, прежде чем продолжить.
Изучая исходный код ядра (linux-2.6.10 - версия, на которой основана книга "Разработка ядра Linux, второе издание" ), я также заметил, что некоторые коды могут добровольно вызвать функцию schedule()
, давая другой процесс право на бег.
Я видел, что функция switch_to()
- это та, которая фактически выполняет контекстный переключатель. Я просмотрел некоторые зависимые от архитектуры коды, пытаясь понять, что на самом деле делал switch_to()
.
В этом поведении возникли некоторые вопросы, на которые я не мог найти ответы:
-
Когда заканчивается
switch_to()
, каков текущий текущий процесс? Процесс, который называетсяschedule()
? Или следующий процесс, который был выбран для запуска? -
Когда
schedule()
вызывается прерыванием, выбранный процесс запуска запускается, когда обработка прерываний заканчивается (после некоторого RTE)? Или до этого? -
Если функция
schedule()
не может быть вызвана из прерывания, когда установлен флаг-need_resched
? -
Когда обработчик прерывания таймера работает, какой стек используется?
Я не знаю, смогу ли я понять. Если бы я не мог, я надеюсь, что смогу сделать это после некоторых ответов (или вопросов). Я уже рассмотрел несколько источников, пытающихся понять этот процесс. У меня есть книга "Linux Kernel Development, sec ed", и я тоже ее использую. Я немного разбираюсь в MIP и архитектуре H8300, если это поможет объяснить.