进程管理笔记三、完全公平调度算法CFS

本文深入探讨Linux的完全公平调度器(CFS),解析CFS调度算法的原理,包括虚拟时钟vruntime、调度策略和执行时间。阐述CFS如何通过红黑树实现进程调度,并讨论了nice值与权重的关系。同时,文章还提出并解答了关于CFS调度的四个有趣问题,如新进程vruntime的初始化、休眠进程vruntime的变化、时间片最小值以及进程迁移时的vruntime处理。
摘要由CSDN通过智能技术生成

进程管理笔记三、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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值