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

全部博文(102)

文章存档

2011年(8)

2010年(94)

我的朋友

分类: LINUX

2010-01-24 22:01:23

原帖子地址: 


(stranger)
09-03-20 12:16
 Re: CFS 调度 []

能不能分析一下commit e17036dac是怎么解决这个问题的: 
 

这个patch就是一行: 
--- a/kernel/sched_fair.c 
+++ b/kernel/sched_fair.c 
@@ -283,7 +283,7 @@ static void update_min_vruntime(struct cfs_rq *cfs_rq) 
struct sched_entity, 
run_node); 

- if (vruntime == cfs_rq->min_vruntime) 
+ if (!cfs_rq->curr) 
vruntime = se->vruntime; 
else 
vruntime = min_vruntime(vruntime, se->vruntime);

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


(member)
09-03-24 13:28
 Re: CFS 调度 []

这个函数的原型是这样的: 

static void update_min_vruntime(struct cfs_rq *cfs_rq) 

u64 vruntime = cfs_rq->min_vruntime; 

if (cfs_rq->curr) 
vruntime = cfs_rq->curr->vruntime; 

if (cfs_rq->rb_leftmost) { 
struct sched_entity *se = rb_entry(cfs_rq->rb_leftmost, 
struct sched_entity, 
run_node); 

if (!cfs_rq->curr) 
vruntime = se->vruntime; 
else 
vruntime = min_vruntime(vruntime, se->vruntime); 


cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime); 


更新cfs运行队列最小虚拟运行时间,与当前运行任务及红黑树最左结点的vruntime相关。 
cfs_rq->vruntime是随着进程调度不断增加的。它总是选择curr与rb_leftmost结点中较小的那个. 

patch的逻辑是为了避免这样一种情况:cfs_rq->curr存在但其vruntime并未增加,这会导致红黑树 
的 vruntime不更新,即使存在最左结点,且其vruntime比curr小的情况。 





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

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


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

这个问题我看了一下午,有点晕 

请大侠们一同来分析下,提供几个链接 

http://www.google.com/custom?domains=lkml.org&q=1af5f730fc1bf7c62ec9fb2d307206e18bf40a69&sa=Google+Search&sitesearch=lkml.org&client=pub-3128732077138691&forid=1&ie=UTF-8&oe=UTF-8&flav=0000&sig=IZwGi0IG8Xeqz31p&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23336699%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3Adde8e8%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BFORID%3A1&hl=en

 
 


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

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


(stranger)
09-03-25 18:51
 Re: CFS 调度 []

> patch的逻辑是为了避免这样一种情况:cfs_rq->curr存在但其vruntime并未增加, 
> 这会导致红黑树的vruntime不更新,即使存在最左结点,且其vruntime比curr小的情况。 

似乎反了吧. 现在的代码里, 如果cfs_rq->curr->vruntime == cfs_rq->min_vruntime, 
那么cfs_rq->min_vruntime是不会更新的. 我现在没想清楚的是, cfs_rq->min_vruntime 
到底有哪些作用? 为什么会引起优先级高的没有及时执行. 

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


(stranger)
09-03-25 20:09
 Re: CFS 调度 []

似乎应该是这样的。根据他们讨论的例子,一个cpu上有一个计算型的低优先级的任务 (C), 
一个高优先级的任务用来看电影的 (H),还有一个迁移到本cpu上的任务 (M) 的vruntime特别大. 
C是不太可能sleep的, 而H因为要读盘等是要sleep的, 但又需要能够及时响应. 当H去sleep时, 
M被迁移过来, 注意此时curr就是C, 这个时候增加cfs_rq->min_vruntime是有风险的. 如果此时 
就把min_vruntime前移一大步的话, 等到H被唤醒时, 注意place_entity()会根据min_vruntime 
增大H->vruntime, 而C却不会, 所以就导致了C->vruntime小了H->vruntime很多, 从而可以执行 
较长的时间, 再导致H短时间内得不到响应. 

总之, min_vruntime增加的太快就容易有问题, 而慢点似乎就没有什么问题.

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


(member)
09-03-26 00:35
 Re: CFS 调度 []

可能是我理解错了,再仔细看下。 
我理解的是有个nice=19的低优先级real-time进程A,还有些idle进程。 
由于A优先级比较低,那么每次调度完都会尽量往树右边移,且其vruntime变化较大. 


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

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

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