Жогда ядро завершает обработку задачи пользовательского пространства и готово пере-лвп> управление задаче пользовательского пространства, оно сперва проверяет, какой за-jne можно передать управление. Это не должна быть задача пользовательского пространства, которая передает управление ядру. Например, если задача А порождает сис-шный вызов, после завершения системного вызова ядро передает управление системой жиаче В.
Каждая задача в системе имеет флаг «необходимости перепланировки», который усевается, когда задачу следует перепланировать:
include/linux/sched.h
988 static inline void set_tsk_need_resched(struct task_struct *tsk)
989 {
990 set_tsk_thread_flag(tsk,TIF_NEED_RESCHED);
991 }
992
993 static inline void clear_tsk_need_resched(struct task_struct *tsk)
994 {
995 clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED); }
1003 static inline int need_resched(void)
1004 {
1005 return unlikely(test_thread_flag(TIF_NEED_RESCHED));
1006 }
Строки 988-996
Интерфейсы set_tsk_need_resched и clear_tsk_need_resched позволяют устанавливать архитектурно-специфический флаг TIF_NEED_RESCHED.
Строки 1003-1006
need_resched проверяет, установлен ли TIF_NEED_RESCHED во флаге текущего процесса.
Когда ядро возвращается в пользовательское пространство, оно выбирает процесс, которому нужно передать управление, как описано в schedule () и scheduler_ tick(). Тогда как scheduler_tick () может пометить задачу как требующую перепланировки, только schedule () может манипулировать этим знанием; schedule () циклически выбирает новую задачу для выполнения до тех пор, пока новая выбранная задача не потребует перепланировки. После завершения schedule () новая задача получает управление процессором.
Поэтому, пока процесс запущен, системный таймер порождает прерывания, запускающие scheduler_tick(); scheduler_tick() может помечать задачу как требующую перепланировки и перемешает ее в массив истекших. При завершении операций ядра за scheduler_tick () могут следовать другие прерывания и ядро будет передавать управление процессором, a schedule () вызываться для выбора следующей запускаемой задачи. Поэтому scheduler_tick() отмечает процессы и сортирует очереди, но schedule () выбирает следующую задачу и передает управление процессором.