В каком контексте запускается код планировщика? - PullRequest
12 голосов
/ 18 августа 2011

В двух случаях код планировщика schedule() вызывается -

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

  2. Таймервызовы прерывания schedule()

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

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

Ответы [ 3 ]

8 голосов
/ 18 августа 2011

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

2 голосов
/ 05 сентября 2013

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

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

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

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

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

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

http://lxr.free -electrons.com / source /ядро / SCHED / core.c # L2389

0 голосов
/ 18 августа 2011

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

...