- 论坛徽章:
- 0
|
在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,真是太巧了(http://www.gossamer-threads.com/ ... l/1058728?page=last)
呵呵 ,欢迎大家讨论 |
|