|
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 = ¤t->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;
}
我是个初学者,,望人指点一下。。。 |
|