调度器的精髓–优先级下兼顾公平

现在回读linux的调度器,O(1)调度器简直就是一个过渡,2.4之前的O(n)调度器曾经和cfs调度器是多么的接近啊!我们不应该只把眼光注意在O(X)的括号内,要知道这个括号内的数字并不能说明这个调度器的优劣,它仅仅是调度行为中的一环而已,是一个理想化的基本原则,正如80/20原则所言,真正为了修复这个理想情况中所有的不理想因素所花费的时间和空间要大得多,所以cfs调度器便抛弃了以前的命名法,难道它还能比O(1)命名法括号内的数字更小吗?显然不能!

O(n)调度器下,只有运行队列中再没有进程的时候才会重新计算所有已经被剥夺运行进程的时间片,睡眠中的进程并没有得到特别的照顾,因为它们在还没有耗尽时间片的时候就被剥夺了运行机会,因此其时间片可以被累加,这样的话,一旦运行队列中没有进程了,实际上还有一些进程在睡眠,比如IO进程,比如交互进程。这个调度器和cfs调度器是多么得相似,只是缺少了:1.pick-next的高效算法;2.多处理器独立队列;...要知道算法的效率直接来源于数据结构而不是思想,另外向多处理器的扩展本身就是一个扩展,也不能否定调度器的设计思想。很多人都对O(1)调度器情有独钟,抛开宣传因素不讲,其本身也算是带来了两三年的高效率,然而我个人在接触了cfs调度器之后却总是对O(1)调度器不甚看好,看看其设计是多么的复杂吧,有多少行代码浪费在计算动态优先级上,而计算动态优先级本身就要涉及到睡眠时间,一个运行队列分裂为两个数组本身仅仅对于pick-next算法有利,为了这点微薄的利益,再看看饥饿避免算法吧...暴露在proc文件系统中的众多调度器微调开关真的迷惑了很多年轻的程序员,当然也包括我自己。到头来发现,真的不需要这么多的开关,cfs调度器实际上就是在O(n)调度器上进行了两点修改,一个是将数组变成了红黑树,另一个就是支持了每cpu一棵树,分级调度暂且不考虑。如果说cfs是一个去伪存真的调度器的话,它更多的是去除了O(1)的伪而保留了O(1)的真谛!虽然O(1)调度器和cfs调度器的设计者是一个人,我宁愿相信他在O(1)中绕了一大圈后回归了原点。如果说O(n)调度器的时间大多浪费在pick-next,那么O(1)调度器确实可以迷惑很多人,因为调度器的命名法,很多人都以为调度器的工作就是pick-next。

去了华为面试,面试官看了我的简历,以调度器为题目企图难为一个叫赵亚的大专生,兹以上文驳斥,遂无言,归,不语!

原文链接: https://blog.csdn.net/dog250/article/details/5302874

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    调度器的精髓--优先级下兼顾公平

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/410641

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 下午12:08
下一篇 2023年4月26日 下午12:08

相关推荐