当进程处于内核模式时,其优先级是否构成抢占?
假设有两个进程,优先级分别为 3 和 5。很明显,在用户模式下,优先级 5 的进程可以被优先级 3 的进程抢占。当它们都处于内核模式时会发生这种情况吗?
除了等待 IO、系统调用需要很长时间、同一 CPU 发生中断等之外,内核抢占的其他机会是什么?
答案1
所有调度决策都发生在内核模式下:当进程在用户模式下运行时,在内核再次控制之前,其下一个调度点不会发生。
进程优先级在调度时以多种方式发挥作用,但较高优先级进程可以通过一种明确的途径影响调度。当任务变得可运行时,钩子check_preempt_curr
被调用,如果新运行的任务比当前运行的任务具有更高的优先级,则钩子请求重新调度。这不立即引起重新安排,但这标志着下次有可能重新安排时,应该考虑。这通常会在退出用户空间时发生(参见示例exit_to_usermode_loop
在 x86 上),所以不久之后。如果调度程序运行时另一个任务更“值得”运行,则重新调度也可能不会重新调度新运行的任务。
每当达到抢占点时,或者在低延迟内核上,每当内核运行不在关键部分的代码时,就会发生抢占。
看各种抢占配置选项,函数__schedule
的文档, 和完全公平调度程序的文档了解详情。