linux 内核在 2.6.23 种引入了一种完全公平的进程调度方式,就是 cfs 调度算法,该算法比起原来的 O(1) 算法来说确实简便了不少,但是却高效了很多,合理了很多。
我研究这个 cfs 算法已经快一年了,但是至今也不敢写一篇关于它的文章,因为它太神圣了,太美妙了,像我这样的文笔,我这样糟糕的表达方式能做的仅仅是亵 渎 cfs 算法。 cfs 没有用哪怕一种额外的补充算法,也没有列举很多额外的约定,只是提供了一条,仅仅一条简单的规则,引入了一个概念,虚拟时钟的概念, 就可以把 cfs 表述的如此美妙,简直令人叫绝, cfs 中的无极变速思想更是让人拍案,它彻底抛弃了时间片的概念,正是将调度决策引入一种更加灵活的方式, 实际上时间片是不合理的,无论何时保证公平才是合理的,有人会问,按照权值分配不同的时间片不也是很合理吗?实际上每时每刻都让每个进程感到公平你不觉得 更加合理吗?时间片分配中,在当前时间片没有完成之前,除了抢占是没有办法执行别的进程的,即使突然来了一位猛士,然而在 cfs 中,系统并不偏向在任何时 期的任何进程,即使该进程的时间片还没有用完。 cfs 保证的是每时每刻的公平, cfs 依据的是进程的执行时间,利用的是补偿原理, cfs 让进程先超前运 行,然后补偿别的进程,这样很合理。另外 cfs 不用任何启发算法,只是一个虚拟时钟就够了,因为当进程睡眠的时候,其虚拟时钟就不走了,这样当然落后于别 的进程的虚拟时钟,理应得到补偿。
cfs 真是太猛了,我即便再不敢亵渎它,却还是写下了这篇拙文。