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调度器_模型实现的更多相关文章
- linux cfs调度器_理论模型
参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下 ...
- linux cfs调度器
在抽象模型中vruntime决定了进程被调度的先后顺序,在真实模型中决定被调度的先后顺序的参数是由函数entity_key决定的. static inline s64 entity_key(str ...
- Linux内核——进程管理之CFS调度器(基于版本4.x)
<奔跑吧linux内核>3.2笔记,不足之处还望大家批评指正 建议阅读博文https://www.cnblogs.com/openix/p/3262217.html理解linux cfs调 ...
- Linux进程管理 (2)CFS调度器
关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...
- 【原创】(五)Linux进程调度-CFS调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- CFS调度器(1)-基本原理
首先需要思考的问题是:什么是调度器(scheduler)?调度器的作用是什么?调度器是一个操作系统的核心部分.可以比作是CPU时间的管理员.调度器主要负责选择某些就绪的进程来执行.不同的调度器根据不同 ...
- Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)
1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...
- Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)
1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度. 具体实现时,CFS通过每个进程的虚拟运行时间(vrun ...
- Linux CFS调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)
1. 负荷权重 1.1 负荷权重结构struct load_weight 负荷权重用struct load_weight数据结构来表示, 保存着进程权重值weight.其定义在/include/lin ...
随机推荐
- C#学习笔记(24)——C#将PPT批量转为JPG(最简单的方法)
说明(2017-8-1 11:15:46): 1. 哈哈,我就说微软肯定有自己的办法,把PPT转成图片. 2. 主要是要引入两个微软自己的程序集,vs里自带直接添加引用,注意一下版本,12.0是off ...
- WPF学习笔记(1)——image控件图片不显示的问题
说明(2017-6-7 16:08:35): 1. 本来想用winform的,用winform就没这么多破事了. 2. 不过项目要用WPF,拉出一个mediaelement控件,视频正常显示. 3. ...
- [转]mysql如何利用Navicat 导出和导入数据库
MySql是我们经常用到的数据,无论是开发人员用来练习,还是小型私服游戏服务器,或者是个人软件使用,都十分方便.对于做一些个人辅助软件,选择mysql数据库是个明智的选择,有一个好的工具更是事半功倍, ...
- 关于dubbo的provider和consumer都配置timeout超时时间的情况
本文转自:http://blog.csdn.net/lkforce/article/details/54380201 前言 在dubbo的provider和consumer的配置文件中,如果都配置了t ...
- json数据在前端(javascript)和后端(php)转换
学习目的:前后端数据交换 思路: json数据格式是怎么样? 后端各种语言怎么将自己内容转换成json格式的内容? 前端怎么接收json数据?有几种方式? js中怎么将json数据转换成js中的数 ...
- mysql中文进行全文索引支持问题
先来看看对一个字段做全文索引,作为一个数据库系统需要做哪些工作? 假设一个文章表里面包含几个字段:文章id.文章作者.文章标题.文章内容 比如,我们对文章内容这个字段artilce_content建立 ...
- REST接口调用经验
1. 调用接口的时候对于参数或返回值的单位一定要注意啊,比如有的分数用的百分制,有的用的小数...,坑大了
- Java 将图片转二进制再将二进制转成图片
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...
- 【javascript】浮点数运算问题分析及解决方法
问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的 ...
- Java sun.misc.unsafe类
Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的.如果你想搞破坏,可以使用Unsafe这个类.这个类是属于sun.*API中的类,并且它不是J2SE中 ...