Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244804
  • 博文数量: 32
  • 博客积分: 557
  • 博客等级: 中士
  • 技术积分: 431
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-20 23:05
文章分类

全部博文(32)

文章存档

2015年(4)

2014年(2)

2012年(4)

2011年(22)

分类: LINUX

2011-07-21 18:25:49

请看附件,里面使用了公式编辑器,word打开需开启宏
 按照RCU的分析经验,上来就先看了相关的数据结构,然后找到sched_init函数,准备画架构图,却也分析的云里雾里。这也是正常的,马克思教导我们,发展要经历否定之否定,任何事情都是螺旋上升的。所以不可能一次将这一块完全搞清楚,必须在有个大概的轮廓之后,再结合其他部分对这些数据结构的应用,才能更清楚的理解。

牵涉到的数据结构主要有sched_group, sched_domain, sched_class, sched_statistics, sched_entity, sched_rt_entity;
task_struct, task_group, runqueue, cfs_rq.

在这里也能体现出管理流与执行流的区别,在这里执行流就是进程调度,即从rq中选出task_struct来执行,以及对进程状态变化的处理;管理流就是CPU负载平衡。

已经看了两天,执行流中各数据结构的关系(rq, cfs_rq, se, ts)相对清晰;平衡流中数据结构(rq, cpu, sd, sg, tg, cgroup)很是复杂,并且牵涉其他模块如cpumask, cgroup,topology等,其他概念如SMT/MC/SMP/NUMA。并且这只是初始化部分,随着CPU hotplug,和cgroup task_group的创建和销毁,还会增加和删除sched_doamin。

好,有难度才好,有问题就一个一个的列出来,摆正顺序,一个一个克服。
列出来就会发现其实也就只有那几个问题。

本文会研究两个方面:
① CFS/RT进程调度算法关联的数据结构含义,忽略statistics;
② 负载均衡,前期重点在于理清sched_domain、sched_group的关系,后期研究过载与平衡的过程;
③ 为达成以上两点,需要具备的知识,过程中解决

本人基础:
① 去年大致看过schedule函数,sched fair的enqueue,dequeue过程;
② ULK3 看过两遍(忘了很大一部分)

PS: damn chinaunix,从blog换成了blog168,看来要做两手准备了,这些东西不好丢,丢不起;
本文内容,同时参见

总结全文
画图,去除“.png”后缀,使用visio查看
介绍multi-core的load-balance时performace and power saving之间的权衡
介绍根据ACPI SLIT构建multi-level sched_domain结构
阅读(11915) | 评论(41) | 转发(3) |
给主人留下些什么吧!~~

wangjianchangdx2011-08-04 11:48:11

经过一番搜索,基本上确定per-cpu中的cpu,并不是指cpu package或者说物理CPU,而是指逻辑CPU,即对应于物理CPU中的core或者SMT中的每一个thread。所以per-cpu变量拷贝的份数,并不是物理cpu的个数,而是NR_phys * NR_MC_cores * NR_SMT_threads;
目前,还不是很确定,所以需要继续找确凿的证据。

这样的话,percpu的sibling sched_domain和sched_group的个数足以对应到每个logical cpu,负载均衡机制sched_domain和sched_group的结构图也就很容易画出来了。
这篇文章中,画了一张图,估作参考
http://hi.baidu.com/_kouu/blog/item/acc103cf4430d61593457e4

wangjianchangdx2011-07-27 00:55:10

看完文档之后,要开始看代码了,要针对那些问题看代码呢?
1. sched_class之间的关系?暂略
2. tick要做什么? update vruntime,maintain rbtree,check preempt
3. schedule要做什么? pick next, execute
4. {en,de}queue_task要做什么?增加和删除rbtree中的entity;
5. rbtree 数据结构

是要先看tick还是先看enqueue和dequeue呢?虽然之前仔细的看过rbtree,现在还是忘的一干二净,只知道ULK3中有讲,还有对他的名字稍微有点熟悉而已。还是先看看rbtree究竟是怎么样一个数据结构,然后看enqueue/dequeue是怎么样从一个空的rbtree,往里面加、删entity的,再看tick中是如何操作rbtree中的entity的,先要知道entity是如何来的,然后才看是如何操作他的。

数据结构为程序逻辑服务,程序逻辑

wangjianchangdx2011-07-27 00:33:12

文档中有几处比较微妙的:
In CFS the virtual runtime is expressed and tracked via the per-task p->se.vruntime (nanosec-unit) value.
其中expressed & tracked,per-task p->'se'.vruntime,个人觉得第一个表述比较微妙,可以揣摩一下,呵呵

CFS's task picking logic: it always tries to run the task with the smallest p->se.vruntime value (i.e., the task which executed least so far)

下面的rbtree部分,与之前的数据结构作了简短的对比,没有使用array switch, 没有超时队列等等,summing up部分的描述相当犀利:执行一个进程一段时间,如果这个进程执行完了或者阻塞了自己调用shche

wangjianchangdx2011-07-27 00:14:48

根据目前对调度流的了解,提出几个问题,探讨研究的主线和方向。

① vruntime concept&update
② rbtree增、删、移动
③ algorithm: 如何update vruntime,维护rbtree,pick next task等
列出这三点,我们可以发现那句话:数据结构 + 算法 = 程序;这里的数据结构有vruntime和rbtree,程序逻辑操作着数据结构。

④ {en,de}queue_task何时被调用;
⑤ sched_class:RT与fair等的关系;

因为其他问题都需要深入代码,属于内部机制,而第四个问题可以做泛泛了解,并且属于外围问题,那就先从第四个问题开始;第五个问题不是很紧迫,没有全面的了解是无法知道,并且我前期只打算研究CFS(fair)调度机制,所以暂时搁置。
搜索中发现,Document/scheduler/sched_design_CFS.txt中有对这些函数的介绍

wangjianchangdx2011-07-26 23:59:13

目前所了解的与进程调度相关的,有schedule和tick,schedule函数执行进程调度切换等实际任务,实际上为了提高进程切换的速度,个人以为不会在schedule去维护rb_tree,而只是选择leftmost,然后来执行而已;而tick则更新时间片(在后面会看到CFS没有时间片的概念)信息,调整进程在rb_tree中的位置,这里可以提出两个问题:
① rbtree中se的何时,如何插入和删除;
② schedule函数,即进程调度何时执行,换句话说,就是进程调度的时机问题;

第一个问题是在{en,de}queue_task中,那这些在何时被调用呢?也就是说什么时候enqueue,什么时候dequeue呢,可以很想当然的理解为进程创建是enqueue, 进程终止的时候dequeue,姑且先这样理解;
第二个在操作系统的书中有讲,针对Linux网上有一些资料,综合而言,个人觉着进程发生调度(切换),分主动和被动,根据调度策略不同,分时间片用完和被高优先级进程抢占。
看一下网上的分法: