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

全部博文(102)

文章存档

2011年(8)

2010年(94)

我的朋友

分类: LINUX

2010-01-24 22:06:39


(member)
09-03-31 13:58
 Re: CFS 调度 []

这个可以根据cfs的思想来看:cfs调度是根据rb-tree,树的结点排列是依照每个调度实体的vruntime 
在一段时间内,会把所有的进程都调度一遍,这样,树里每个进程获取的运行时间,当然与它的优先级息息相关。 

关键是运行完后更新vruntime,优先级低的依然会居于树的靠右侧。这样会保证高优先级或交互进程有较多的运行时间和响应时间。 

具体到你的问题,应该是树的最右结点与最左结点的差别,这个没有调试环境,我也没具体测过。 

希望有比较直观的数据,就容易分析了,您说呢? 


--------------------
夜,明月,窗前,烟

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
09-03-31 14:07
 Re: CFS 调度 []

这种调度器的没什么好的调试环境吧, 可能也就是看看CONFIG_SCHED_DEBUG的那些信息, 然后写些测试用例什么的.

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(member)
09-03-31 14:10
 Re: CFS 调度 []

恩。 再回到您第一次说的那个问题 

新改的patch所避免的情况,咱们能讨论下么? 




--------------------
夜,明月,窗前,烟

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
09-03-31 14:11
 Re: CFS 调度 []

> 为什么要限定范围呢? 只有idle进程,增长快慢就没有关系啊~ 就怕有normal进程 

现在没有, 以后会有的;) 如果只有IDLE的vruntime在涨, cfs_rq->min_vruntime不涨的话, 那就有问题了.

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(member)
09-03-31 14:16
 Re: CFS 调度 []

可能误会了 

如果cfs-rq里只有idle tasks,那么vruntime一定会-----至少涨得“速率”很快 ---我不敢说“剧增”了 :-) 
那就照正常的cfs-rq vruntime更新规则就是了 

为什么要限制 max(se->runtime)-min(se->runtime)呢? 




--------------------
夜,明月,窗前,烟

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
09-03-31 15:28
 Re: CFS 调度 []

不是要去限制, 我只是觉得现在已经是这样的了(不是很确定;) 如果有这个限制, 而且这个值不大的话, 就没有大跃进了.

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(member)
09-03-31 15:35
 Re: CFS 调度 []

恩,我会再仔细看下代码,希望能到找相关的数据,验证下idle task的变化趋势。 

能讨论下我上面说的那三种假设情况么? 因为我觉得那部分有问题 


--------------------
夜,明月,窗前,烟

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
09-03-31 15:41
 Re: CFS 调度 []

哪三种?

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(member)
09-03-31 15:46
 Re: CFS 调度 []


假设现在3种情况: 
1) 只有一个task A.那么A的vruntime就是队列的vruntime 
2) A 和 一些idle进程 ,A调度后更新vruntime,会走: 
vruntime = min_vruntime(vruntime, se->vruntime); 
这个判断 
3)A 出列,此时curr=null,队列只剩下idle,此时走: 
vruntime = se->vruntime; 
显然,这时候vruntime会一下子变得很大,但没有关系。-->patch的关键就是为了避免A存在也走这个流程。 


就是调用update_min_runtime()时cfs_rq->min_vruntime的变化。 


--------------------
夜,明月,窗前,烟

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(newbie)
09-03-31 16:03
 Re: CFS 调度 []

1) 只有一个task A.那么A的vruntime就是队列的vruntime 
是的. 

2) A 和 一些idle进程 ,A调度后更新vruntime,会走: 
vruntime = min_vruntime(vruntime, se->vruntime);这个判断 
是的. 

3)A 出列,此时curr=null,队列只剩下idle,此时走: 
vruntime = se->vruntime; 
显然,这时候vruntime会一下子变得很大,但没有关系。-->patch的关键就是为了避免A存在也走这个流程。 

看起来不是. A出列, update_min_vruntime时curr还不是NULL. 
schedule() 
-> deactivate_task() 中 update_min_vruntime() 
-> put_prev_task() 中 cfs_rq->curr = NULL 
-> pick_next_task() 中 cfs_rq->curr = se 
我就没找到一条路径, 当执行update_min_vruntime是, curr==null

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


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