本文对CFS调度算法关键知识点进行梳理

nice 值和运行时间的关系

nice 值的范围-20 ~ 19,进程默认的nice值为0。这些值类似与级别,可以理解成40个等级,nice 值越高,优先级越低,nice值越低,优先级越高。
为什么这么设定,因为nice表示进程友好程度,值越大,对其他进程越友好,就会让出cpu时间给其他进程。
进程每降低一个nice级别,优先级提高一个等级,响应进程可多获得10%的cpu时间。
进程每提升一个nice级别,优先级则降低一个级别,响应进程少获得10%的cpu时间。
nice值相当于系数1.25。

内核提供的nice值与权重对应关系表
代码路径: kernel/sched/core.c

/** Nice levels are multiplicative, with a gentle 10% change for every* nice level changed. I.e. when a CPU-bound task goes from nice 0 to* nice 1, it will get ~10% less CPU time than another CPU-bound task* that remained on nice 0.** The "10% effect" is relative and cumulative: from _any_ nice level,* if you go up 1 level, it's -10% CPU usage, if you go down 1 level* it's +10% CPU usage. (to achieve that we use a multiplier of 1.25.* If a task goes up by ~10% and another task goes down by ~10% then* the relative distance between them is ~25%.)*/
const int sched_prio_to_weight[40] = {/* -20 */     88761,     71755,     56483,     46273,     36291,/* -15 */     29154,     23254,     18705,     14949,     11916,/* -10 */      9548,      7620,      6100,      4904,      3906,/*  -5 */      3121,      2501,      1991,      1586,      1277,/*   0 */      1024,       820,       655,       526,       423,/*   5 */       335,       272,       215,       172,       137,/*  10 */       110,        87,        70,        56,        45,/*  15 */        36,        29,        23,        18,        15,
};

举例:
假设进程A和B的nice值都为0,那么理想运行时间计算公式

1024 / (1024 + 1024) = 50%

1024是因为A和B的进程权重值1024

当A 进程nice值增加到1,B依然是0
对于A进程理想运行时间

820 / (820 + 1024) = 44.5%

对于B进程理想运行时间

1024 / (820 + 1024) = 55.5%

vruntime 值怎么来的

vruntime = ( delta_exec * nice_0_weight ) / weight

vruntime 表示进程虚拟的运行时间,delta_exec 表示实际运行时间,nice_0_weight 表示nice值为0的进程的权重值,weight表示该进程的权重值。

sched_period 怎么算的

sched_period 是下面说的调度周期,也就是本次调度周期总的cpu时间,是物理运行时间,通过函数 __sched_period 计算得到
代码路径: kernel/sched/fair.c

/** The idea is to set a period in which each task runs once.** When there are too many tasks (sched_nr_latency) we have to stretch* this period because otherwise the slices get too small.** p = (nr <= nl) ? l : l*nr/nl*/
static u64 __sched_period(unsigned long nr_running)
{if (unlikely(nr_running > sched_nr_latency))return nr_running * sysctl_sched_min_granularity;elsereturn sysctl_sched_latency;
}

当进程的数目小于8时,则调度周期等于调度延迟等于6ms。当系统的进程数目大于8时,则调度器周期等于进程的数目乘以0.75 ms,系统要保证每个进程最小调度时间0.75 ms。

ideal_runtime 值怎么来的

ideal_runtime 表示理想运行时间,也就是分配给进程的时间

分配给进程的真实运行时间 = 本次调度周期总的cpu时间 * ( 当前进程的权重 / 就绪队列(runnable)所有进程权重之和 )

所以得出结论

ideal_runtime = 本次调度周期总的cpu时间 * ( 当前进程的权重 / 就绪队列(runnable)所有进程权重之和 )

根据 sched_period 可知,总时间固定的情况,每个进程理想运行时间也是知道的,如果一个进程是cpu密集型,每次调度会使用整个理想时间,如果是IO密集型的,应该用不完这个时间。

总结

sched_period 的目的是决定每个task在本次调度周期可以运行的最大时间。
如果某个task超过了自身的 ideal_runtime,则会自动让出调度的机会,CFS选择 vruntime 最小的task运行,并在下次得到调度的时候,重置 sched_period 和 ideal_runtime。

vruntime 决定的是哪个进程先调度,sched_period 决定的是每个进程在当前调度周期的最大执行时间。

Linux CFS调度算法关键知识点相关推荐

  1. Linux CFS调度算法核心解析

    回家的路上,聊了下CFS调度器-我昨天不是写了一篇批判性的文章嘛: [为什么Linux CFS调度器没有带来惊艳的碾压效果] https://blog.csdn.net/dog250/article/ ...

  2. linux中O(1)调度算法与全然公平(CFS)调度算法

    一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表 ...

  3. Linux CFS调度

    本文代码均基于主线4.19 LTS ,欢迎指正,持续更新. 目录 1. 度量 1.1 优先级 1.2 Weight 1.3 virtual runtime 1.4 physical runtime 1 ...

  4. 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...

    文章转自公众号"人人都是极客" 但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核 ...

  5. 万字整理,图解Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  6. Linux内存管理:知识点总结(ARM64)

    https://mp.weixin.qq.com/s/7zFrBuJUK9JMQP4TmymGjA 目录 Linux内存管理之CPU访问内存的过程 虚拟地址转换为物理地址的本质 Linux内存初始化 ...

  7. 为什么Linux CFS调度器没有带来惊艳的碾压效果? | CSDN博文精选

    任何领域,革命性的碾压式推陈出新并不是没有,但是概率极低,人们普遍的狂妄在于,总是认为自己所置身的环境正在发生着某种碾压式的变革,但其实,最终大概率不过是一场平庸. 作者 | dog250 责编 | ...

  8. 万字整理,肝翻Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  9. 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

最新文章

  1. 【观点】程序员应知——循序渐进
  2. ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前...
  3. 逻辑卷、物理卷、卷组相关操作
  4. RTMP直播应用与延时分析
  5. 前端学习(604):编程语言
  6. Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
  7. oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
  8. 挚同道合,物所不能!挚物·AIoT产业领袖峰会报名进入倒计时!
  9. KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
  10. MySQL执行计划 EXPLAIN参数
  11. 通过手动抛自定义异常实现spring事务回滚
  12. open cv+C++错误及经验总结(十)
  13. 一些实用的DBA语句(持续学习,持续更新)
  14. 关于经纬度坐标转换的方法
  15. oracle碎片整理
  16. 程序员工资高会封顶吗?网友:会谢顶
  17. Chinese-Whisper聚类算法
  18. [Git]删除git文件历史记录
  19. 微信公众平台开通业务域名
  20. java excel 批注_Java 添加、修改、读取、复制、删除Excel批注

热门文章

  1. js 实现页面朗读功能,利用百度语音API
  2. 必装软件大放送 让你的PPC真正成为智能手机
  3. python rot13,Python文本加密:rot13
  4. 微信短信验证码登录教程
  5. 原型和Axure的作用
  6. SWOOLE进阶-06网络IO模型-阻塞模型
  7. Django+bootstrap+注册登录系统
  8. android sina 微博表情功能的实现
  9. 为什么CMS两次标记时要 stop the world(阿里面试)
  10. 编译kernel外部模块