linux进程调度CFS策略

linux调度策略分多种,其中最常见的就是CFS(Completely Fair Scheduler)调度策略。下面主要介绍一下CFS调度策略的原理及实现流程。

实现目标

在调度普通进程时,为了实现高优先级进程能被优先调用,同时保证所有进程都有机会被调用,避免CPU一直被高优先级进程占用,linux设计了CFS调度策略。

实现原理

下面针对CFS调度策略的目的讲解它的实现原理。

  1. 为了保证高优先级任务能被优先调用,linux为每一个普通进程设置了对应的优先级,而每一个优先级对应一个权重,进程实际被调用时间和权重相关。

linux内核在实际实现时,通过nice值表示优先级,取值范围为[-20, 19]。nice值和权重具有一一对应关系,数值越小表示优先级越高,对应的权重也就越高。nice值和权重对应关系在内核中通过如下数组反映:

nice = 0对应的优先级为120,对应的权重为1024。普通进程默认的nice值即为0,即NICE_0_LOAD。

每个进程在一个调度周期内实际被调用时间计算方式如下:

实际运行时间 = 调度周期 * (进程权重 / 所有进程权重之和)

2. 为了保证在一个调度周期内,低优先级进程也能有机会被调用,防止CPU一直被高优先级进程霸占,CFS调度策略引入了虚拟调度时间概念。在CFS调度策略中,所有进程总的可运行的虚拟运行时间均相等,且每次调度时选择已运行虚拟调度时间最小的进程调用。

进程的虚拟调度时间如下:

虚拟运行时间 = 实际运行时间 * NICE_0_LOAD / 进程权重

                       = 调度周期 * (进程权重 / 所有进程权重之和) * NICE_0_LOAD / 进程权重

                       = 调度周期 * NICE_0_LOAD / 所有进程权重之和

从上面公式可知,可以得出以下两个结论:

  • 由于在一个调度周期内,调度周期、NICE_0_LOAD(1024)、所有进程权重之和均为定值,因此所有进程的虚拟运行时间均相等
  • 实际执行相等时间时,优先级高的进程对应使用的虚拟运行时间更少,即消耗的虚拟运行时间更少

对于上面结论综合起来通俗地讲即,虽然所有进程的虚拟运行时间均相等,调度时也选择已运行虚拟时间更小进程进行调用,但对于高优先级进程来说,运行相同实际时间时,其虚拟运行时间增加的更少,消耗的更慢,下次调度时更可能被选择调用。

       通过上面分析可知,CFS调度策略通过实际运行时间和虚拟运行时间概念,实现了使高优先级进程更大概率、更多时间被调用,同时低优先级进程也能在调度周期内得到调度,即公平与优先得到了很好地平衡。

调度实体保存方式

       为了提高查找、删除效率,内核采用红黑树的数据结构保存CFS调度的进程。根据红黑树特性,虚拟运行时间小的进程调度实体存放在红黑树的最左边,虚拟运行时间大的进程调度实体存放在红黑树的最右边。CFS调度器每次调度时选择红黑树最左边节点即可。

调度周期

CFS调度器的调度周期不是固定的,而是根据实际调度场景进行调整。

  • 当调度队列上排队进程数小于等于8个时,调度周期固定为6ms
  • 当调度队列上排队进程数大于8个时,为了保证各个进程能得到有效调度的同时避免频繁地切换线程增加系统开销,调度周期调整为:排队进程数 * 0.75ms

内核实现如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值