- 论坛徽章:
- 0
|
wxc200
(member)
09-03-31 13:58
![]()
Re: CFS 调度 [
re: ffjnfj
]
![]()
编辑
![]()
回复
这个可以根据cfs的思想来看:cfs调度是根据rb-tree,树的结点排列是依照每个调度实体的vruntime
在一段时间内,会把所有的进程都调度一遍,这样,树里每个进程获取的运行时间,当然与它的优先级息息相关。
关键是运行完后更新vruntime,优先级低的依然会居于树的靠右侧。这样会保证高优先级或交互进程有较多的运行时间和响应时间。
具体到你的问题,应该是树的最右结点与最左结点的差别,这个没有调试环境,我也没具体测过。
希望有比较直观的数据,就容易分析了,您说呢?
--------------------
夜,明月,窗前,烟
文章选项:
![]()
![]()
![]()
![]()
ffjnfj
(stranger)
09-03-31 14:07
![]()
Re: CFS 调度 [
re: wxc200
]
![]()
回复
这种调度器的没什么好的调试环境吧, 可能也就是看看CONFIG_SCHED_DEBUG的那些信息, 然后写些测试用例什么的.
文章选项:
![]()
![]()
![]()
![]()
wxc200
(member)
09-03-31 14:10
![]()
Re: CFS 调度 [
re: ffjnfj
]
![]()
编辑
![]()
回复
恩。 再回到您第一次说的那个问题
新改的patch所避免的情况,咱们能讨论下么?
--------------------
夜,明月,窗前,烟
文章选项:
![]()
![]()
![]()
![]()
ffjnfj
(stranger)
09-03-31 14:11
![]()
Re: CFS 调度 [
re: wxc200
]
![]()
回复
> 为什么要限定范围呢? 只有idle进程,增长快慢就没有关系啊~ 就怕有normal进程
现在没有, 以后会有的;) 如果只有IDLE的vruntime在涨, cfs_rq->min_vruntime不涨的话, 那就有问题了.
文章选项:
![]()
![]()
![]()
![]()
wxc200
(member)
09-03-31 14:16
![]()
Re: CFS 调度 [
re: ffjnfj
]
![]()
编辑
![]()
回复
可能误会了
如果cfs-rq里只有idle tasks,那么vruntime一定会-----至少涨得“速率”很快 ---我不敢说“剧增”了 :-)
那就照正常的cfs-rq vruntime更新规则就是了
为什么要限制 max(se->runtime)-min(se->runtime)呢?
--------------------
夜,明月,窗前,烟
文章选项:
![]()
![]()
![]()
![]()
ffjnfj
(stranger)
09-03-31 15:28
![]()
Re: CFS 调度 [
re: wxc200
]
![]()
回复
不是要去限制, 我只是觉得现在已经是这样的了(不是很确定;) 如果有这个限制, 而且这个值不大的话, 就没有大跃进了.
文章选项:
![]()
![]()
![]()
![]()
wxc200
(member)
09-03-31 15:35
![]()
Re: CFS 调度 [
re: ffjnfj
]
![]()
编辑
![]()
回复
恩,我会再仔细看下代码,希望能到找相关的数据,验证下idle task的变化趋势。
能讨论下我上面说的那三种假设情况么? 因为我觉得那部分有问题
--------------------
夜,明月,窗前,烟
文章选项:
![]()
![]()
![]()
![]()
ffjnfj
(stranger)
09-03-31 15:41
![]()
Re: CFS 调度 [
re: wxc200
]
![]()
回复
哪三种?
文章选项:
![]()
![]()
![]()
![]()
wxc200
(member)
09-03-31 15:46
![]()
Re: CFS 调度 [
re: ffjnfj
]
![]()
编辑
![]()
回复
"
假设现在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的变化。
--------------------
夜,明月,窗前,烟
文章选项:
![]()
![]()
![]()
![]()
ffjnfj
(newbie)
09-03-31 16:03
![]()
Re: CFS 调度 [
re: wxc200
]
![]()
回复
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
文章选项:
![]()
![]()
![]()
![]()
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/110888/showart_2159282.html |
|