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

现在回读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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值