没有合适的资源?快使用搜索试试~ 我知道了~
首页CFS调度算法 详细解析
资源详情
资源推荐
CFS 调度器
--wxc200
大家好哈,
兄弟最近在学习调度器,有点儿心得,更多得是迷惑,写出心得来与大家分享,
贴出迷惑来请大家解答。呵呵
linux 自 2.6.23 后引入了一种新的调度器,叫'Completely Fair Scheduler'(wiki).是
由 Ingo Molnar
在很短的时间内写的。他与的 cfs 代码是对之前另一种调度器
"O(1) scheduler" 的替换.
先扯一下 o(1)调度.
先看 wiki 的解释:
"An O(1) scheduler is a kernel scheduling design that can schedule processes within a
constant amount of time, regardless of how many processes are running on the operating
system (OS)."
Understanding Linux Kernel(3th) 这本书 chapter 7 讲的进程调度,7.2 节提
到"Scheduling Algorithm",说 2.6 对进程的选择是 constant time,兼顾了批处理和交互
式进程.进程分类,实时进程(又分为 SCHED_FIFL AND SCHED_RR)和普通进程.
最主要的问题是这些进程怎么组织的,简单看下结构:
没办法传图片,请参照附件"数组".
它有两个数
组,active 里面是
has time-slice
,expired 数组是
out-of-slice。简单
的说,一个普通
的进程被调度运
行后,放在 active
里,当其时间片
用光后,可能就要移到 expired “ ”数组里了。说 可能 是因为有的进程就不移走。比
如交互式进程。
说白了,就是把所有的 process 按照优先级挂在链表上,从里面按照优先级高低选择
第一个不为空的进程运行.
普通进程的优先级是 100~139,实时进程要更低,这符合调度的算法.
我有点等不及了,咱们直接奔 cfs 吧~
另外有点就是,引入 hrtimer 之后,进程调度还是在 tick 中断完成的.每个 tick 都会检
查进程是否应该调度,当然,主动让 cpu(即调用 scheduler().)的就不算了吧...
hrtimer 那部分东东等咱们聊完了 cfs 再说,那个主要是在原有的时间管理 layer 上
“ ”新添加了 时间事件 ,把时间中断以事件的方式注册。精确度由之前的 hz 提升到
了 ns(需要硬件支持)。。。
cfs
Documentation/scheduler/sched-design-CFS.txt 介绍了 cfs 相关东西,也可以在线看 .
“ ”我按照我的理解来 添油加醋 地翻译下。
1 概括
“80% of CFS's design can be summed up in a single sentence: CFS basically models
an "ideal, precise multi-tasking CPU" on real hardware.”
""Ideal multi-tasking CPU" is a (non-existent :-)) CPU that has 100% physical
power and which can run each task at precise equal speed, in parallel, each at
1/nr_running speed. For example: if there are 2 tasks running, then it runs
each at 50% physical power --- i.e., actually in parallel.
"
模 拟了个理想的,多任务 cpu.假如有 n 个进程,那么每个进程 的执行速度是 1/n,,
即所有的任务都是并行执行的。我认为就算是有并行执行的 cpu,速度也不应该
完全平均,按照优先级再分比较划算。比如 2 个进 程,a,b,a 的优先级是 b 的两
倍,那么就照着速度比 a:b = 2:1 呗~
“On real hardware, we can run only a single task at once, so we have to
introduce the concept of "virtual runtime." The virtual runtime of a task
specifies when its next timeslice would start execution on the ideal
multi-tasking CPU described above. In practice, the virtual runtime of a task
is its actual runtime normalized to the total number of running tasks. ”
当然没有这种 cpu,故引进了个新概念"virtual runtime",这个概念真是折磨人好久。
我曾经在 clf
上发帖子 问过,有个兄弟回复还是不错的。后面看过代码后,我的理
解是:1 ) 红黑树结点排列的值 2 ) 每次 task run time 转换的一个值 .
先看上文颜色部分,我真是很难翻译它~ 照字面理解,是实际运行时间与任务数
量的一个比值 ? 我举个例子来说明它是怎么计算 的吧。。
在 __update_curr()这个函数里,会更新当前任务的运行时间信息。假如一个任务
a 自上次调度到这次调度时间间隔为 delta, 那么它的 vrumtime 的增量是按照这个公
式:delta * NICE_0_LOAD / a->se.load。假如把 NICE_0_LOAD / a->se.load 作为一
个比值 p 的话,我们可以这么描述 p 的变化:优先级越高,p 越小。这个 load 是
与 nice 值 相关的,有一个静态的数组,我后面在代码里会介绍。
所以,一堆进行都运行了一段时间 delta,那么它们的 vrumtime 就遵循上面的公
式。很明显,优先级最大的进程 vrumtime 增量最小。。。
2 操作细节
cfs 就是通过追踪这个 vruntime 来进行任务调度的。它总是选 vruntime 最小的进程
来运行。
3 红黑树。
红黑树这个数据结构在内核里用得还不少嘛,不过俺不太懂。哪位兄弟给扫扫
盲? hrtimer 里也用到了 red-black-tree。这里把进程的 vruntime 用 rb-tree 来存储。
4 一些 feature
cfs has no time-slice concept.o(1)有的,cfs “ ”没有 明显 得用,它偷偷摸摸地用。呵
呵 “翻译完这几段咱再说这个。文档里面那个接口估计是用来调整 最小粒
” “ ” “ “ 度 的。用于 桌面 和 服务器 两 种不同的调度。后者可能不太希望频繁的调
度,浪费时间。前者则希望面面俱到--” “不患寡妇而患不均也
5 调度 policy
SCHED_FIFO/_RR are implemented in sched_rt.c and are as specified by POSIX. 实时
进程调度
实时调度和普通进程调度。
6 调度的类。
调度哭可以模块化注册,所以你可以选择实时调度或者是 cfs 调度。不错!
sched_fair.c 文件实现了 cfs 调度的所以 classes
7 组调度。
不光是普通进程,组调度也实现了。。这个是后来一个 patch 加的。
×××××××××××××××××××××××××××××××××××
上面 是对着内核的一篇文档,简要地说了几部分 。。。在正式进行我们的 hack
之前,先唠叨几句,算是个总结和感性的认识吧~吼吼
关于实时进程的调度,这一次先不分析,它和 o1 差不多,还保持着优先级数组的
” “ ” “做法,那是 上流社会 玩儿的游戏,后面再折腾它。 普通大众 们玩儿的就是 cfs
了。
cfs 调度,我写两 部分,一部分是普通进程的调度,没有组的概念。一部分是组
的调度。我个人觉得组得调度比较难理解~ 这几天一直在思考。。。今天下午好
像豁然开朗了。。。画了个草图,到后面我做出这张图来,大家看看对不对 :D
咱们先说普通进程的调度
关于普通进程的组织,应该有这么一种印象。
有一个队列,叫 cfs_rq,里面维护了个红黑树。每一个 task_struct has a se,称为调度
实体。它就代表了一个被调度的进程,里面有此进程的一些信息,比如前面提到
的 vruntime.
一个进程创建的时候,就会被放置在这个红黑树里。它自己的位置是由它的
vruntime 值 来决定的。在每个 tick 中断的时候,会更新进程的信息,并检查这个
红黑树,判断某些进程是不是要被替换掉。
现在我们来想象下面一个例程。
进 程 a 被创建了,sched_fork()会做一些新创建进程调度方面的初始化。然后应该
尝试把此进程放到队列里啊,让它被调度。 set_task_cpu()做了这部分工作。然后
这个进程如果不是实时进程,就让它跟 cfs 的类绑定在一块儿,这样下面用到调度
的一些方法,就会到 cfs 相关的类去找喽~ 这时候如果抢占打开了,会去调度一
次,以让新创建的进程有机会被调度一次。或者在下一个 tick 的时候,会检查已
经红黑树,以确认这个进程是不是调度。(注:上面红色这句有点胡扯的嫌疑,
请明白人指点)
比如在每个 tick 中断的时候,会去红黑树里面找 vruntime 最小的那个(红黑树最
左边的叶子)去调度。那么这个调度过程,所有用到的方法,就是上面提到的 cfs
的类给实现的。
最后,大家再对 rb-tree 里面的任务结点有个感性的认识吧:
优先级高的进程,总是靠左,以有最大调度机会。比如说有 n 个进程,那么在一
段时间内,应该把 n 个进程都运行一遍。这儿有两三个问题,一段时间是多久?
每个进程有多少时间去运行呢?每个进程分到的运行时间跟 vruntime 有什么关系
呢?
一段时间,与运行着的进程数目有关。进程越多,时间越长。每个进程并不是平
均分配这些时间的。按照我的理解,分到这个时间越多的进程,后面 vruntime 增
长得越慢。
上面 这几句话,我可是晕了近一个星期才明白的。不知道跟大家的理解一致么?
本 来我错误得理解是这样的,完全公平调度么,当然所有的进程有同样的运行时
间。如果是这样,那么 rb-tree 就没用了。因为每个结点都一样的值。所以,请 大
家有这样一种概念:两 个进程,a 优先级特别低,b 特高。假如现在有 n 个正被调
度的进程,它们都被调度一遍的时间是 delta,那么 b 会占很高的时间,a 很低的
时间。运行完成后,b 还是在很靠左的地方呆着,而 a 一定往最靠右的地
方。。。。哎,表述不清啊,,最好画个图。。。这样就为了让 b 得到更常的运
行时 间。。。而其 vruntime 仍然很小(可以参照上封邮件里面那个计算 vruntime
的公式)
好了
我们开始真正的代码旅行吧。
1 几个重要的数据结构
1)task_struct : 大家都知道这个。
struct task_struct {
...
int prio, static_prio, normal_prio; 进程的优先级
unsigned int rt_priority;实时进程的优先级
const struct sched_class *sched_class; 调度类,一堆函数指针,实现调度
struct sched_entity se; 调度实体 一个进程对应一个调度实体,,
struct sched_rt_entity rt;
....
}
2) sched_class 调度相关的函数指针。
struct sched_class {
...
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup); 入列
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep);出列
void (*yield_task) (struct rq *rq);
void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int sync);检查当前进
程可否被新进程抢占
struct task_struct * (*pick_next_task) (struct rq *rq); 选择下一个进程运行
void (*put_prev_task) (struct rq *rq, struct task_struct *p);
#ifdef CONFIG_SMP
int (*select_task_rq)(struct task_struct *p, int sync);
剩余33页未读,继续阅读
Knight_Dragon
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功