我知道“need_resched 标志是向内核发出的一条消息,即应尽快调用调度程序,因为应该运行另一个进程”,但我遗漏了一些要点:
谁负责检查这个标志?有一个内核进程ad hoc吗?最后,可能我唯一想提出的问题是:内核在设置标志后尽快调用 schedule() 做什么?
我希望我已经清楚了,
斯特凡诺
通常,将在中断和系统调用返回路径中检查此标志 - 如果在从中断或系统调用返回时设置它,并且(在中断情况下)内核是可抢占的,那么内核将在返回之前调用重新调度函数之一.
例如,在arch/x86/kernel/entry_32.S 中:
358 ENTRY(resume_userspace)
359 LOCKDEP_SYS_EXIT
360 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
361 # setting need_resched or sigpending
362 # between sampling and the iret
363 TRACE_IRQS_OFF
364 movl TI_flags(%ebp), %ecx
365 andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
366 # int/exception return?
367 jne work_pending
368 jmp restore_all
369 END(ret_from_exception)
请注意,need_resched 是 TI_flags 中的一个位标志,_TIF_WORK_MASK
包括大多数 TI_flags 位,包括 need_resched 的位。还有许多其他类似的检查,返回内核路径也有显式检查。
只要安全,内核代码就会显式地检查这个标志,schedule
如果设置了这个标志就会调用。它不能被任何外部进程或异步机制检查,因为它的全部目的是处理不可抢占的代码,只能自愿让出 CPU。