need_resched infos(linux kernel 2.6.30)

时间:2012-06-16 18:30:57

标签: linux kernel scheduler

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

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

我希望我很清楚,

斯特凡诺

2 个答案:

答案 0 :(得分: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的位。还有许多其他类似的检查,返回内核路径也有明确的检查。

答案 1 :(得分:0)

内核代码在安全的情况下显式检查此标志,如果设置了标志则调用schedule。任何外部进程或异步机制都无法检查它,因为它的全部目的是处理不可抢占的代码,并且只能自愿生成CPU。