linux cfs调度器_模型实现
调度器真实模型的主要成员变量及与抽象模型的对应关系
I、cfs_rq结构体
a) struct sched_entity *curr
指向当前正在执行的可调度实体。调度器的调度单位不是进程,而是可调度的实体。每个task_struct都嵌入了一个可调度实体sched_entity,所以每个进程是一个可调度实体。可以将多个进程捆绑在一起作为一个调度单位(即调度实体)进行调度。因此,可调度实体可以是一个进程,也可以是多个进程构成的一个组。为了简化,暂时把curr理解为指向当前正在运行的进程。
d) struct rboot tasks_timeline
cfs就绪队列是用红黑树来组织的,tasks_timeline存放红黑树的根节点。
c) struct rb_node *rb_leftmost
指向红黑树最左边的那个节点。即,vruntime值最小的那个进程对应的节点。
d) unsigned long nr_running
可运行进程的总数,即队列进程的总数加上正在运行的那个进程。
e) struct load_weight load
struct load_weight {
unsigned long weight, inv_weight;
}
load.weight保存着cfs_rq队列上所有进程(包括当前正子运行的进程)的权重值weight的总和。
f) min_vruntime
min_vruntime用来解决下列问题:
min_runtime调度模型的遗留问题————原有系统上运行A、B、C三个进程,新进程D被创建时它的runtime应该如何设置???或者,睡眠的进程醒来后其runtime该如何设置???
min_vruntime的值初始的时候为0, schedule_tick周期性调度器负责周期性地调用min_vruntime的值和可运行的进程中最小的vruntime值比较,如果该进程的vruntime值比min_vruntime大,那么就将min_vruntime值更新为较大值。min_vruntime的值只会随着时间的推移增加,不会减少。(注意:min_vruntime的值有可能比一些进程的vruntime大)。
II、sched_entity结构体
a) unsigned int on_rq
用来标识该实体上是否在就绪的队列上,如果在就绪队列上则该值非零。
b) struct load_weight load
load.weight表示该调度实体的权重
c) u64 sum_exec_runtime
表示进程已经执行的实际时间,对应抽象模型中的runtime
d) u64 pre_sum_exec_runtime
进程在切换经CPU时的sum_exec_runtime值
sum_exec_runtime - pre_sum_exec_runtime等于进程获得CPU使用权后总的总时间。(ideal_runtime已被消耗了多少)
e) u64 vruntime
该进程已经运行的虚拟时间,对应抽象模型中的vruntime。
f)u64 exec_start
表示上次tick中断时设置的时间戳。
注意rq:clock表示本次tick发生时的时间戳。
抽象模型和真实模型的对应关系
抽象模型 真实模型 说明
-----------------------------------------------------------------------------------------------
task->runtime task->se.sum_exec_runtime 每个进程对应一个可调度实体,
在task_struct的结构体,该实体
就是成员变量se。
-----------------------------------------------------------------------------------------------
task->weight task->se.load.weight
-----------------------------------------------------------------------------------------------
task->vruntime task->se.vruntime
-----------------------------------------------------------------------------------------------
sum_weight(task,N) cfs_rq->load.weight 在抽象模型中,我们计算ideal_runtime
的时候需要求所有进程的权重值
的和,在实现的时候, 没有求和
的过程,而是把该值记录在就绪
队列 的load.weight中。向就绪队
列中添加新进程时,就加上新进
程的权重值,进程被移除就绪队
列时则减去被移除的进程的权重。
-----------------------------------------------------------------------------------------------
cfs_rq->min_vruntime 该值用来解决之前在抽象模型中遗留
的问题(新加入进程的runtime如
何处理,进程睡眠唤醒后的 runtime
如何处理……),因此没有抽象
模型中与之对应的值。
-----------------------------------------------------------------------------------------------
task->ideal_runtime sched_slice()函数 每个进程的ideal_runtime并没有用
变量保存起来,而是在需要用
到时用函数sched_slice()计算
得到。
task[i]->se.load.weight
task[i]->ideal_runtime = ------------------------- * period
cfs_rq->load.weight
-----------------------------------------------------------------------------------------------
period __sched_period()函数 period也没有用变量来保存,用函
数计算得到。
sysctl_sched_latency * (nr_running / sysctl_nr_latency)
-----------------------------------------------------------------------------------------------
linux cfs调度器_模型实现相关推荐
- 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...
文章转自公众号"人人都是极客" 但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核 ...
- 为什么Linux CFS调度器没有带来惊艳的碾压效果? | CSDN博文精选
任何领域,革命性的碾压式推陈出新并不是没有,但是概率极低,人们普遍的狂妄在于,总是认为自己所置身的环境正在发生着某种碾压式的变革,但其实,最终大概率不过是一场平庸. 作者 | dog250 责编 | ...
- Linux CFS调度器:原理和实现
目录 CFS调度器的重点 基本概念 一些问题 源码和补充 调度类和调度策略 优先级分类 多处理器系统 rq的平衡 概念部分只讲解CFS调度器 CFS调度器的重点 基本概念 Linux 2.6版本在我看 ...
- Linux CFS调度器分析
进程被调度的条件是什么,以及真正发生调度的时刻又是在哪里? 以下结论和代码分析都是基于最新Linux master分支(Linux5.0) 1. 调度的时刻 1.1 当前进程主动放弃CPU或者调用ms ...
- cpu调度的最小单位_Linux CFS调度器
一直没有写过关于Linux内核调度器的内容,这几天被问起,简单的讲了讲,收到一堆challenge,这次决定做一个通篇总结方便自己整理思路. 要说Linux2.4和2.6最大的差异就在于CFS调度器的 ...
- 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )
文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...
- Linux调度器及CFS调度器
Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 调度:就算按照某种调度的算法 ...
- 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )
文章目录 一.CFS 调度器就绪队列 cfs_rq 二.Linux 内核调度实体 sched_entity 三." 红黑树 " 数据结构 rb_root_cached 一.CFS ...
- 【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )
文章目录 一.调度器类 sched_class 简介 二.CFS 调度器类源码 三.next 赋值 四.enqueue_task 赋值 五.dequeue_task 赋值 一.调度器类 sched_c ...
最新文章
- 《大道至简》第一章编程的精义伪代码读后感
- 网页怎么在图片上添加文字_想给图片添加文字,留白,添加小印章?用手机三步搞定...
- 学习笔记57_WCF基础
- 面向对象的程序设计-模块二课程总结
- C语言试题五十六之计算并输出给定整数n的所有因子(不包括1与自身)之和。规定n的值不大于1000。
- Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
- Java 死锁及解决方法
- 20190920 On Java8 第二十章 泛型
- 工厂和反射的使用方法
- IDL where函数与array_indices函数
- 第一章:WTL的5个W
- Idea集成使用SVN教程
- 云服务器安装不了声卡,驱动精灵怎么安装声卡 声卡驱动安装方法
- android toast 大小,Android Toast实现全屏显示
- MAC 外接键盘卡顿处理
- 高校选课系统的设计与实现
- python元组使用什么符号表示方括号_Python的精髓居然是方括号、花括号和圆括号!...
- BS 476-31 与BS 476-33 测试方法是类似的吗?
- 国产芯片---超高速、高输出电流,电压反馈放大器MS8241兼容替代LM7171
- c#语言用XmlReader解析超大XML文件
热门文章
- Redis数据结构——字典-hashtable
- No valid Qt version set. Set one in Tools/Options 问题(QT)
- 插入数据前查询是否存在_异步检测数据是否存在的修订
- 关于配置中心的几个问题
- 深入理解RocketMQ中的NameServer
- java使用rabbitmq
- 【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕
- dp、sp 转换为 px 的工具类
- 关于Java Collections Framework的一些总结(2)
- javascript脚本中使用json2.js解析json