wukui1008 发表于 2012-1-19 13:19:08

se.avg_wakeup se.avg_overlap 疑问

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;
      }
我是个初学者,,望人指点一下。。。
页: [1]
查看完整版本: se.avg_wakeup se.avg_overlap 疑问