Я пытаюсь понять, как на самом деле работает процесс расписания в ядре 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, если это поможет объяснить.