进程管理笔记三、CFS调度算法
引言:CFS是英文Completely Fair Scheduler的缩写,即完全公平调度器,负责进程调度。在Linux Kernel 2.6.23之后采用,它负责将CPU资源,分配给正在执行的进程,目标在于最大化程式互动效能,最小化整体CPU的运用。使用红黑树来实现,算法效率为O(log(n))。
一、CFS调度算法原理
调度算法最核心的两点即为调度哪个进程执行、被调度进程执行的时间多久。前者称为调度策略,后者为执行时间。
1.1、调度策略
cfs定义一种新的模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(即一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。
调度器总是选择vruntime值最低的进程执行。这就是所谓的“完全公平”。对于不同进程,优先级高的进程vruntime增长慢,以至于它能得到更多的运行时间。
1)、公平的体现:机会平等,时间差异
公平体现在vruntime (virtual runtime, 虚拟运行时间)上面,它记录着进程已经运行的时间,其大小与进程的权重、运行时间存在一个定量计算关系。
vruntime = 实际运行时间 * 1024 / 进程权重
实际上1024等于nice为0的进程的权重,代码中是NICE_0_LOAD,也就是说,所有进程都以nice值为0的权重1024作为基准,计算自己的vruntime增加速度。结合分配给进程实际运行的时间,可得如下换算关系:
分配给进程的时间 = 调度周期 * 进程权重 / 全部进程权重之和
vruntime = 实际运行时间 * 1024 / 进程权重
vruntime = (调度周期 * 进程权重 / 全部进程权重之和) * 1024 / 进程权重
vruntime = (调度周期 / 全部进程权重之和) * 1024
可以看到进程在一个调度周期内的vruntime值大小与进程权重无关,所有进程的vruntime值在一个周期内增长是一致的。vruntime值较小的进程,说明它以前占用cpu的时间较短,受到了不公平对待,因此选择作为下一次运行的进程。
这样既能公平选择进程,又能保证高优先级进程获得较多运行时间,就是cfs的主要思想了。其可以简单概括为:机会平等、时间差异。
1.2、执行时间
cfs采用当前系统中全部可调度进程优先级的比重确定每一个进程执行的时间片,即:
分配给进程的时间 = 调度周期 * 进程权重 / 全部进程之和。
假如有三个可调度进程A、B、C,它们的优先级分别为5,10,15,调度周期为60ms, 则它们的时间片分别为:60ms * 5 / 30 = 10ms、60ms * 10 / 30