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

В каком контексте выполняется код планировщика?

Есть два случая, когда вызывается код планировщика schedule() -

  • Когда процесс добровольно вызывает schedule()

  • Запросы прерывания по таймеру schedule()

В случае 2, я думаю, schedule() работает в контексте прерывания, но как насчет первого случая? Выполняется ли она в контексте процесса, который вызвал его?

Также есть ли еще сценарии, вызывающие schedule()?

4b9b3361

Ответ 1

schedule() всегда работает в контексте процесса. Во втором случае, когда он инициируется прерыванием таймера, он возвращается в обратном пути от ядра к прерванному процессу, где вызывается schedule().

Ответ 2

__ schedule() - основная функция планировщика.

Основными средствами управления планировщиком и, таким образом, ввода этой функции являются:

  • Явная блокировка: мьютекс, семафор, ожидание и т.д.

  • Флаг TIF_NEED_RESCHED проверяется на пути прерывания и пути использования пользовательского пространства. Например, см. Arch/x86/entry_64.S. Чтобы управлять превенцией между задачами, планировщик устанавливает флаг в обработчике прерывания таймера scheduler_tick().

  • Просветы действительно не приводят к входу в расписание(). Они добавляют задачу в очередь выполнения и ее. Теперь, если новая задача, добавленная в очередь выполнения, вытесняет текущую задачу, то пробуждающие наборы TIF_NEED_RESCHED и schedule() вызывают в ближайшем возможном случае:

    • Если ядро ​​является превентивным (CONFIG_PREEMPT = y):
      • в syscall или контексте исключения, на следующем outmost preempt_enable(). (это может быть как только wake_up() spin_unlock()!)
      • в контексте IRQ, возврат из обработчика прерываний в превентивный контекст
    • Если ядро ​​не является вытесняемым (CONFIG_PREEMPT не задано), то в следующем:
      • вызов cond_resched()
      • Явный запрос расписания()
      • возврат из syscall или исключения в пользовательское пространство
      • Возврат из обработчика прерываний в пользовательское пространство

http://lxr.free-electrons.com/source/kernel/sched/core.c#L2389

Ответ 3

Когда процесс вызывает schedule(), он запускается в контексте системного вызова, который основан на прерывании. Во втором случае аппаратное прерывание вызывает вызов schedule(). В обоих случаях он работает как прерывание. AFAIK - это единственные моменты, когда вызывается schedule(), потому что большинство манипуляций с планированием включает в себя изменение очереди запуска ядра вещей, которые планируется запланировать, хотя процесс может быть прерван, но обычно это делается через прерывание, чтобы сообщить процессу о выходе или процесс, приносящий себя.