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

这篇博客介绍了Linux内核从2.6.23版本开始采用的Completely Fair Scheduler(CFS)调度算法,它以虚拟时间为核心概念,通过红黑树实现公平的任务调度。CFS不依赖优先级,而是利用权重来调整任务执行时间,高优先级任务有更多执行机会。任务在红黑树中按虚拟运行时排序,最左侧的任务优先获得CPU时间,维持执行平衡。
调度算法&spm=1001.2101.3001.5002&articleId=8970422&d=1&t=3&u=c5ae4451e18b443c85482a0df3b55ba7)
2358

被折叠的 条评论
为什么被折叠?



