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

全部博文(102)

文章存档

2011年(8)

2010年(94)

我的朋友

分类: LINUX

2010-01-24 22:23:14

原文地址 



(member)
09-04-10 00:30
 update_curr()更新任务虚拟运行时间讨论

在cfs调度中,对调度实体vruntime的更新放在下面这个函数里: 
__update_curr(cfs_rq,curr,delta_exec) 
关于这个函数的计算细节,我在之前一篇小文里介绍过。 

有许多模糊的地方,请大家一起讨论。 

第一个问题,就是关于delta_exec这个参数: 
/* 
* Get the amount of time the current task was running 
* since the last time we changed load (this cannot 
* overflow on 32 bits): 
*/ 
delta_exec = (unsigned long)(now - curr->exec_start); 
其中now,代表运行队列当前的时间,curr->exec_start有两个设置的地方: 
1)在更新cfs_rq->curr的函数set_next_entity()里,会调用update_stats_curr_start() 
将exec_start设置为当前运行队列的时间: 
se->exec_start = rq_of(cfs_rq)->clock; 
照comment的解释,将开始一个新的运行周期 
2)即在上面__update_curr()完成后,exec_start被设置为rq的时间 

那这个delta_exec是代表进程两次被调度到的时间间隔么? 
还是两次更新update_curr()之间的间隔? 


第二个问题,关于我的猜测 

从两个设置exec_start()的点来看,design基于两种考虑: 
1) 任务a被调度,cfs_rq->curr=a, 此时exec_start设置。调用update_curr()时,计算a从被调度到现在的时间, 
作为a的运行时间。这是比较好理解的。 
2) update_curr()调用的位置比较多,没有仔细研究连续两个update_curr()调用之间的关系。有可能两次update_curr() 
调用之间curr并没有变,这时候需要更新任务的vruntime,只能计算从上次update到现在的时间了。 
恰好找到了这么种情况,一搜今天有哥们还提了个patch,真是太巧了() 

呵呵 ,欢迎大家讨论 


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

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


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