Linux CFS调度算法关键知识点
本文对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调度算法关键知识点相关推荐
- Linux CFS调度算法核心解析
回家的路上,聊了下CFS调度器-我昨天不是写了一篇批判性的文章嘛: [为什么Linux CFS调度器没有带来惊艳的碾压效果] https://blog.csdn.net/dog250/article/ ...
- linux中O(1)调度算法与全然公平(CFS)调度算法
一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表 ...
- Linux CFS调度
本文代码均基于主线4.19 LTS ,欢迎指正,持续更新. 目录 1. 度量 1.1 优先级 1.2 Weight 1.3 virtual runtime 1.4 physical runtime 1 ...
- 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...
文章转自公众号"人人都是极客" 但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核 ...
- 万字整理,图解Linux内存管理所有知识点
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...
- Linux内存管理:知识点总结(ARM64)
https://mp.weixin.qq.com/s/7zFrBuJUK9JMQP4TmymGjA 目录 Linux内存管理之CPU访问内存的过程 虚拟地址转换为物理地址的本质 Linux内存初始化 ...
- 为什么Linux CFS调度器没有带来惊艳的碾压效果? | CSDN博文精选
任何领域,革命性的碾压式推陈出新并不是没有,但是概率极低,人们普遍的狂妄在于,总是认为自己所置身的环境正在发生着某种碾压式的变革,但其实,最终大概率不过是一场平庸. 作者 | dog250 责编 | ...
- 万字整理,肝翻Linux内存管理所有知识点
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...
- 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...
最新文章
- 【观点】程序员应知——循序渐进
- ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前...
- 逻辑卷、物理卷、卷组相关操作
- RTMP直播应用与延时分析
- 前端学习(604):编程语言
- Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
- oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
- 挚同道合,物所不能!挚物·AIoT产业领袖峰会报名进入倒计时!
- KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
- MySQL执行计划 EXPLAIN参数
- 通过手动抛自定义异常实现spring事务回滚
- open cv+C++错误及经验总结(十)
- 一些实用的DBA语句(持续学习,持续更新)
- 关于经纬度坐标转换的方法
- oracle碎片整理
- 程序员工资高会封顶吗?网友:会谢顶
- Chinese-Whisper聚类算法
- [Git]删除git文件历史记录
- 微信公众平台开通业务域名
- java excel 批注_Java 添加、修改、读取、复制、删除Excel批注