首先非常感谢作者们倾注的心血!在阅读CFS调度相关的章节的时候,我遇到了很大的障碍。
- 首先名词解释过于精炼。比如158~159页的这一段。为什么任务调度时延最差情况下就等于一个调度周期?以及为什么159页第二段,调度周期的默认值是一个上文所说的最差情况「sched_latency」呢?
- 其次是叙述逻辑不连贯。比如159页第二段,开始在讲一个「占比」的问题,后面在解释CFS怎么动态调整调度周期的时间长度以及权衡。逻辑上是割裂的。
- 公式中有很多意义不明的变量。比如159页第一个公式中「time_clice_i」其实就是第二个公式的「real_runtime」,但是他们使用了不同的变量,让人很难确定两个公式之间的联系。另外还有意义不明的「weight_nice0」,下文说道「...该权重和weight_i的比值是一个系数」给人这个系数是确定值的感觉。那既然是确定值为什么不直接写出来呢?以及「weight_nice0」是否是一个定值?还是一个动态调整的值?这个部分没有引入额外的说明,让人想入非非。
- CFS的核心设计没有着重说明。为什么vruntime的增长量应该一样呢?读到159页的最后一段,脑子里充满了上述的疑惑,然后遇到了红黑树和O(1)时间找到vruntime最小的说明。看得人更困惑了,既然上文说 vruntime 的增长量是一样的,那我计算这个vruntime的意义是什么呢?FIFO拿任务感觉也可以呀?为什么还需要设计红黑树来拿最小的 vruntime 任务呢?
总的来说。CFS相关的这一节的体验是糟糕的。书中的解释没能做到为什么引入vruntime,为什么引入Niceness,为什么要计算权重以及为什么要根据vruntime找任务;反而引入了更多的问题。
平心而论,书中的解释确实是正确的。但是这部分的内容的组织造成了「懂的人看起来觉得很显然,而不懂的人看起来一头雾水」这样的结果。
想在两页半的篇幅讲清楚CFS的设计要点确实很难,期待作者们更精彩的增补和解释~!