Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325386
  • 博文数量: 102
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-21 22:33
文章分类

全部博文(102)

文章存档

2011年(8)

2010年(94)

我的朋友

分类: LINUX

2010-03-29 22:26:52

2009/12/5 XingChao Wang @gmail.com> 

> 大家好, 

> 下面是代码: 
> 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是子集关系。 

> p = task_of(se); 
>  hrtick_start_fair(rq, p); 

> return p; 
> } 

> thanks 
> --wang xingchao 

阅读(1524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~