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