LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 947|回复: 0

se.avg_wakeup se.avg_overlap 疑问

[复制链接]
发表于 2012-1-19 13:19:08 | 显示全部楼层 |阅读模式
static void dequeue_task(struct rq *rq, struct task_struct *p, int sleep)
{
        if (sleep) {
                if (p->se.last_wakeup) {
                        update_avg(&p->se.avg_overlap,
                                p->se.sum_exec_runtime - p->se.last_wakeup);
                        p->se.last_wakeup = 0;
                } else {
                        update_avg(&p->se.avg_wakeup,
                                sysctl_sched_wakeup_granularity);
                }
        }

        sched_info_dequeued(p);
        p->sched_class->dequeue_task(rq, p, sleep);
        p->se.on_rq = 0;
}

帮忙分析一下if(sleep)里面的代码。。谢了先
我的理解是:
sleep = 1:进入这个函数之前,p进程已经睡眠了(该进程已经在等待队列里了)
if (p->se.last_wakeup)  是不是说这个进程以前睡眠过,不然还有什么情况能让这个条件为真呢???
else      这个部分难道就是说进程第一次睡眠吗??

还有是不是每次睡眠都要保证p->se.last_wakeup = 0;??
要是这样,那try_to_wake_up里面
        if (!in_interrupt()) {
                struct sched_entity *se = &current->se;
                u64 sample = se->sum_exec_runtime;

                if (se->last_wakeup)//这个地方那不是总是为0了???
                        sample -= se->last_wakeup;
                else
                        sample -= se->start_runtime;
                update_avg(&se->avg_wakeup, sample);

                se->last_wakeup = se->sum_exec_runtime;
        }
我是个初学者,,望人指点一下。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表