date: 2014-11-02 13:16
在《进程的调度与切换》一节中,我们提到,强制调度的两个条件:
-
调度时机:系统调用返回到用户空间前夕,以及中断或者异常服务程序返回到用户空间前夕。可能会有人担心如下两种情况:其一如果进程“躲在”“安全地带”内核空间中不出来,调度器岂不只能干着急?好在内核的设计与实现避免了这个问题。其二:如果进程在用户空间运行,既不调用系统调用函数,也没有中断与异常发生,岂不是也无法进行强转调度?别忘了,系统的时钟中断在默默地坚守着哩。
-
必要条件:当前进程的need_resched字段必须非0。该字段必须由内核去设置,为了让调度器有效运转起来,内核必须“瞅准时机”“见缝插针”地设置该字段。设置的时机包括:
- 其一:在时钟中断服务程序中,当发现当前进程连续运行太长时间时;
- 其二:当唤醒一个睡眠中的进程,发现被唤醒的进程比当前进程更有资格运行时;
- 其三:一个进程通过系统调用改变调度政策(sched_setscheduler)或表示礼让(sched_yield)时。这种情况实际上应该被视为主动的、自愿的调度,因为这些系统调用在返回用户空间时会引起立即调度(而上面两种情况只是设置好了need_resched字段,至于何时能有“调度时机”还是个未知数)。