1

我知道“need_resched 标志是向内核发出的一条消息,即应尽快调用调度程序,因为应该运行另一个进程”,但我遗漏了一些要点:

谁负责检查这个标志?有一个内核进程ad hoc吗?最后,可能我唯一想提出的问题是:内核在设置标志后尽快调用 schedule() 做什么?

我希望我已经清楚了,

斯特凡诺

4

2 回答 2

1

通常,将在中断和系统调用返回路径中检查此标志 - 如果在从中断或系统调用返回时设置它,并且(在中断情况下)内核是可抢占的,那么内核将在返回之前调用重新调度函数之一.

例如,在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 的位。还有许多其他类似的检查,返回内核路径也有显式检查。

于 2012-06-16T18:42:04.847 回答
0

只要安全,内核代码就会显式地检查这个标志,schedule如果设置了这个标志就会调用。它不能被任何外部进程或异步机制检查,因为它的全部目的是处理不可抢占的代码,只能自愿让出 CPU。

于 2012-06-16T18:34:54.053 回答