免费注册 查看新帖 |

Chinaunix

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

请教一个CPU时钟更新的问题(sched_fair.c和sched_rt.c) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-26 08:58 |只看该作者 |倒序浏览
这两个调度算法的文件中都有一个更新CPU  clock的函数,sched_rt为:
static void update_curr_rt(struct rq *rq)
{
        struct task_struct *curr = rq->curr;
        struct sched_rt_entity *rt_se = &curr->rt;
        struct rt_rq *rt_rq = rt_rq_of_se(rt_se);
        u64 delta_exec;
       
        if (!task_has_rt_policy(curr))
                return;

        delta_exec = rq->clock - curr->se.exec_start;
        if (unlikely((s64)delta_exec < 0))
                delta_exec = 0;

        schedstat_set(curr->se.exec_max, max(curr->se.exec_max, delta_exec));
        curr->se.sum_exec_runtime += delta_exec;
        account_group_exec_runtime(curr, delta_exec);
......  ......

sched_fair为:
static void update_curr(struct cfs_rq *cfs_rq)
{
        struct sched_entity *curr = cfs_rq->curr;
        u64 now = rq_of(cfs_rq)->clock;
        unsigned long delta_exec;

        if (unlikely(!curr))
                return;

        /*
         * 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);
        if (!delta_exec)
                return;
....... .......

为什么sched_fair中的delta_exec不用判断是否小于0,而直接判断等于0

现在碰到一个问题,多核CPU上,每个CPU的sched_clock_cpu的值不一样,就出现了CPU0上一会更新为CPU0自己的CLOCK,一会更新为CPU1的CLOCK,但是后者比前者小,结果减出来是个负数,导致很多地方的进程时间不正确.

各位大狭们多多指教,非常感谢!

论坛徽章:
0
2 [报告]
发表于 2011-11-26 10:26 |只看该作者
自己先顶一下. 看到kernel.org上的原始修改:
sched: optimize update_curr()

author Peter Zijlstra <a.p.zijlstra@chello.nl>  
Tue, 16 Dec 2008 07:45:31 +0000 (08:45 +0100)
committer Ingo Molnar <mingo@elte.hu>  
Tue, 16 Dec 2008 08:46:33 +0000 (09:46 +0100)
commit 34f28ecd0f4bdc733c681294d02d9fab5880591b
tree 7869949614b6a4f2bf52f01dfaa769ebe22c8aab tree | snapshot
parent 03e89e4574a680af15f59329b061f35d9813aff4 commit | diff

sched: optimize update_curr()

Impact: micro-optimization

Skip the hard work when there is none.

index 928cd74..5ad4440 100644 (file)

--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -492,6 +492,8 @@ static void update_curr(struct cfs_rq *cfs_rq)
         * overflow on 32 bits):
         */
        delta_exec = (unsigned long)(now - curr->exec_start);
+       if (!delta_exec)
+               return;

        __update_curr(cfs_rq, curr, delta_exec);
        curr->exec_start = now;


只是为了优化, sched_rt上的那个小于0的判断是一直存在的. 不清楚作者为什么不采用和rt一样的判断.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP