免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3354 | 回复: 0
打印 上一主题 下一主题

update_curr()更新任务虚拟运行时间讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-10 00:29 |只看该作者 |倒序浏览
在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)

呵呵 ,欢迎大家讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP