Linux内核的CFS调度类何以保障进程调度的公平?

        近期因为工作需要又翻起了调度类相关的代码。这里对CFS的核心理念和实现方式做一随笔。网络上相关内容极多且主流AI软件均可解释的更加透彻明了,本文仅为笔者个人备份使用,学习相关内容建议阅读内容更全面的书籍与文章。

        CFS调度类的核心思想是所有运行队列中要准备执行的进程都会得到相对均等的CPU时间。“照顾弱者”是CFS很重要的一个调度理念,得到运行CPU时间比较短的进程总能在调度器选择下一个执行进程的时候得到青睐。当然,凡事难有绝对的公平,权重不同的进程仍然体现着完全不同的竞争机会。相对于RT等优先级在调度中发挥着绝对作用的调度类,CFS可以说是称得上公平了。

        那么CFS在程序中如何体现公平呢?CFS的运行队列以一颗红黑树的形式存在,红黑树的节点以vruntime这个指标作为键值进行连接。vruntime是每个进程加权计算后的运行时间。每次调度,CFS调度类会从红黑树中选择左下角的节点代表的进程执行。因为红黑树左下角的节点总是vruntime最小的那个,所以这里说的公平,就体现在这里了。比如下面这颗红黑树,如果节点的键值代表的是vruntime的话,那下一次调度选择进程就会选择vruntime为5的这个进程。

所以vruntime是理解CFS调度很关键的一个指标。首先vruntime是sched_entity节点的一个字段。

 Linux内核在update_curr函数中对其进行更新。

如果当前进程的NICE值是0,不用加权计算,否则要根据进程的权重对执行时间进行加权计算。

如果需要加权计算,其计算过程在__calc_delta函数中实现,其计算原理为:

我们知道CFS调度的进程优先级和权重关系为:

可以看到nice值越小,优先级越高,加权后实际时长就会被更大程度上缩小,起到的直接效果就是vruntime累加的越小,运行队列的红黑树中更容易被排列在左下角的位置,相对其他进程更容易得到调度器更多的调度机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值