linux内核调度在2.6.23 之前使用的大名鼎鼎的O(1)算法。O(1) 调度器跟踪运行队列中可运行的任务(实际上,每个优先级水平有两个运行队列 — 一个用于活动任务,一个用于过期任务), 这意味着要确定接下来执行的任务,调度器只需按优先级将下一个任务从特定活动的运行队列中取出即可)。 O(1) 调度器扩展性更好而且包含交互性,提供了大量启示用于确定任务是受 I/O 限制还是受处理器限制。 相比cfs调度, O(1) 调度器在内核中很笨拙,且复杂。在代码里要转很久才能转出来。
cfs 最核心的概念是虚拟时间,cfs中没有真正意义上的调度时间,而是用虚拟时间去代替。虚拟时间--打个比方就是一个变速器 ,对于权重大的任务虚拟时间跑得慢,也就是他出现在红黑树(快速高效地插入或删除任务)的最左侧的机会更大,他也就会更有机会被调度到。而权重小的就相反。用更官方的语言:CFS 不直接使用优先级而是将其用作允许任务执行的时间的衰减系数。 低优先级任务具有更高的衰减系数,而高优先级任务具有较低的衰减系数。 这意味着与高优先级任务相比,低优先级任务允许任务执行的时间消耗得更快。 这是一个绝妙的解决方案,可以避免维护按优先级调度的运行队列。
这就是精髓所在吧。当然,虚拟时间不只是参考权重,既然叫cfs,就应该体现公平。具体操作:任务存储在以时间为顺序的红黑树中(由 sched_entity 对象表示)&#x