Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244802
  • 博文数量: 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结构
阅读(11914) | 评论(41) | 转发(3) |
给主人留下些什么吧!~~

wangjianchangdx2011-07-22 23:39:17

还是先更新一下进度吧
现在的主要任务还是要画出平衡流中数据结构的框架图;
采用的方法是研究初始化流程,虽然有难度,暂不考虑通过平衡过程去了解这些数据结构的索引方式。是的,我钻上牛角尖了。
初始化过程从arch_init_sched_domains,到build_sched_domains,__build_sched_domains,该函数大致分为三部分:build sched_domain,build_sched_group,calculate power;
现在卡在build sched_domain中SMT/MC/SMP/NUMA所对应的sd的关系及mask的初始化上。
昨天已经研究了cpumask和topology,
现在已经知道node_domains是要覆盖尽可能多的node,在NUMA node之间进行平衡;如果node不能覆盖所有的cpu,则使用上层的allnodes,直接将cpu_map复制给他,已达到平衡时可以回溯到能够mask allcpu的sd的目的。现在问题也就在这里,是否使用a

wangjianchangdx2011-07-22 00:07:25

OK, 又扫了一遍平衡流(sched_domain)初始化的过程,其中的cpumask部分,基本上都可以看懂了,明天再细致的看一下,应该说是今天了,呵呵

wangjianchangdx2011-07-22 00:00:08

topology:
主要目的是要向/sys目录下导出相关信息(Document/cputopology.txt)。
topology.h中也定义了
①初始化SMT/MC/SMP/NUMA对应sched_domain的初始化宏,
② numa_node相关函数,以及

#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_thread_cpumask(cpu)
#define topology_core_cpumask(cpu)等四个宏;

numa_node在cpu_init中使用set_numa_node初始化;
虽然一个CPU可以有多个core,而一个core又可以有多个thread,但cpumask毕竟是cpu的mask,所以同一个cpu的所有core和thread都共享同一个cpumas

wangjianchangdx2011-07-21 21:56:47

倒着来
typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;

#define DECLARE_BITMAP(name,bits) \
        unsigned long name[BITS_TO_LONGS(bits)]

#define BITS_PER_BYTE                8
#define BITS_TO_LONGS(nr)        DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))

#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
为了解决BITS_PER_BYTE * s

wangjianchangdx2011-07-21 19:48:26

init/main.c:
/* Setup number of possible processor ids */
int nr_cpu_ids __read_mostly = NR_CPUS;
EXPORT_SYMBOL(nr_cpu_ids);