分类: LINUX
2010-03-29 22:26:52
2009/12/5 XingChao Wang
> 下面是代码:
> static struct task_struct *pick_next_task_fair(struct rq *rq)
> {
> struct task_struct *p;
> struct cfs_rq *cfs_rq = &rq->cfs;
> struct sched_entity *se;
> if (unlikely(!cfs_rq->nr_running))
> return NULL;
> do {
> se = pick_next_entity(cfs_rq);
> set_next_entity(cfs_rq, se);
> cfs_rq = group_cfs_rq(se);
> } while (cfs_rq);
> 在组调度允许时,这个循环的逻辑是什么? 另外rq->cfs与各个task_group在不同cpu上的cfs_rq之间是什么关系?
> 这个地方看得不是很清楚,有点模糊..
分享下 :
1.
组调度允许的情况下,tg的每个实调度体位于其父组的cfs_rq中。故在选择下一个entity时,应该从每个cpu的runqueue的cfs-rq开始。
2. 由于scheduler entity有可能代表得是task
group而非进程(!se->my_q),所以在选择出se时,有可能是子tg,需要继续search 子tg.
3. 一个cpu上不同级别的task group的cfs_rq与run queue里的cfs_rq是子集关系。
> return p;
> }
> thanks
> --wang xingchao