CFS调度器虚拟时钟归一化理想的破碎

前面一篇文章用图表的形式阐述了cfs的原理,然后那张图表所展示的行为仅仅是理想意义上的行为,我们看一 下它有何不足,它的不足就是太精确了,为何这么说呢?看看每一个vruntime归一化的时间区间,每一个进程运行了好几次,每次运行的时间就是它的速 度,可以看出,权值大的进程其虚拟时钟跑得慢,这样就可以多跑几次,注意它们每次跑时消耗的物理时间是一样的,cfs的理论就这样实现了公平,如果用代码 实现那张图表,结果就是每次时钟中断中都要将当前进程与红黑树中的其余进程作一番权衡比较,这样的结果就是内核调度其可以非常非常精确的以时钟中断的精度 来跟踪各个进程的虚拟时间流逝进而选择最慢的进程,想到这里可以看出,2.6.23中原始的cfs版本就是这么做的,就是在每一次时钟中断处理中先入队再 出队,如果当前进程不是最慢的进程了,那么调度,可是这样的话会造成频繁调度,特别是各个进程权值相同的情况下,大家伙就会波浪式前进,最终的曲线很平 滑,可是内核偏偏不喜欢这种绝对的优美,那么还是将这种优美留给数学家吧。注意,运行中内核的意义就是权衡,就是折中,就好比生活一样,难道人生不是在折 中中前进吗?不能太极端,这就是中庸之道的精髓啊。
     2.6.25内核开始引入了各个进程的vruntime作为尺准,到了2.6.28内核,cfs调度器在2.6.25的基础上发展到了很完美的地步,不再 是每个时钟中断都会检测虚拟时间的快慢,而是一次性让进程将一个系统调度周期按照其权值分配给它的时间段(可以理解为动态时间片)运行完,不再将分给它的 时间一段一段的每段反比于它的权值这种形式运行,于是新内核的形式中在每个时钟中断中就有了以下判断:
static void check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
{
         unsigned long ideal_runtime, delta_exec;
         ideal_runtime = sched_slice(cfs_rq, curr);
         delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
         if (delta_exec > ideal_runtime)
                 resched_task(rq_of(cfs_rq)->curr);
}
这 个判断就是判断分配给它的时间段是否已经运行完了,只有运行完了的话才调度当前进程。calc_delta_weight和 calc_delta_mine可以保证一个系统调度周期中每个进程推进的虚拟时间相同,从而实现归一化,注意,分配给进程的时间是一次性运行完了的,如 果所有进程都是cpu消耗性的进程并且不睡眠,不再创建新进程,也没有进程退出,那么归一化是很严格的,但是在一个调度周期内如果有新进程被创建的话,那 么新进程将会影响到所有的进程的虚拟时间推进,以前用calc_delta_fair(delta_exec, curr)来推进虚拟时间,这里delta是真实物理时间,因为有新进程,那么必须在调度周期内给它分配实际物理时间,那么别的进程在一个调度周期的 delta之和就会变小,从而虚拟时间的推进会变慢(注意,这里的阐述和以前那一篇理想情况的阐述不同),这只是其一,另外还影响了虚拟时间的归一化,比 如当别的进程都推进完该调度周期的虚拟时间之后,最后一个进程在推进途中创建了一个新的进程,那么该进程将不能像别的进程一样推满这个调度周期的虚拟时 间,因为为新进程留了时间,这样的话,当系统认为本来该归一的时候实际上并没有归一,创建新进程的进程的虚拟时间会更慢些,于是它将继续运行。并且在设置 了START_DEBIT调度特性的情况下,情况更复杂,新进程会推进一个它在一个调度周期的虚拟时间段,相当于在前方起跑,者不公平,于是它当然要在前 方等待,如果设置了sched_child_runs_first的话,新进程的vruntime将和curr的交换,从而先于父进程运行。归一化的思想 破碎了吗?是的,破碎了,但是归一化除了美观之外有用吗?没有严格的归一化难道影响了调度器挑选虚拟时钟最慢的进程吗?丝毫没有!CFS的创意已经说过好 几次了,不在于什么形式,而是在于和HZ之类的系统相关的东西解除耦合,可以从update_curr中看出,虚拟时间的推进没有依赖物理时钟,它只是通 过物理时钟的间隔算出一个vruntime的间隔,而就这就够了,保证了公平也就是保证了性能,如果说还是很慢,那么我告诉你怎么办,换cpu吧,软件的 作用只是尽自己的力量挖掘硬件的最优化性能,软件再优秀,它不能无缘无故生出性能。

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

欢迎关注

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

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

    CFS调度器虚拟时钟归一化理想的破碎

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

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

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

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

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

相关推荐