我正在查看实时调度程序的/kernel/sched/rt.c
中update_curr_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; // Time difference (???) if (curr->sched_class != &rt_sched_class) return; // check if sched class is Real-Time sched class delta_exec = rq->clock_task - curr->se.exec_start; if (unlikely((s64)delta_exec <= 0)) return; // ??? schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec)); // I am assuming that se.sum_exec_runtime is total time task ran // and we add time difference to curr->se.sum_exec_runtime += delta_exec; // can be skipped, has to do with threads account_group_exec_runtime(curr, delta_exec); // reset start time curr->se.exec_start = rq->clock_task; cpuacct_charge(curr, delta_exec); // I guess it calculates average ran time of the task sched_rt_avg_update(rq, delta_exec); // can be skipped if (!rt_bandwidth_enabled()) return; // ??? Nothing makes sense for code below for_each_sched_rt_entity(rt_se) { rt_rq = rt_rq_of_se(rt_se); if (sched_rt_runtime(rt_rq) != RUNTIME_INF) { raw_spin_lock(&rt_rq->rt_runtime_lock); rt_rq->rt_time += delta_exec; if (sched_rt_runtime_exceeded(rt_rq)) resched_task(curr); raw_spin_unlock(&rt_rq->rt_runtime_lock); } } }
我会强烈建议你探索cscope和grok的奇观。 在哪里可以输入或点击标识符并查看定义。
这是经典的linux代码:紧凑,重点和可读性。 使用一些宏使得理解有点困难,但是一切都有意义的名字。
对于你所说的“没有任何意义”的部分: for_each_sched_rt_entity
是一个扩展为for循环的宏。 它使代码更紧凑,但更难理解。 基本上,如果我们任务中的任何一个rq都没有运行时间,那么这个任务会被退回给调度器,以便在其他时间重新运行。
十分简单。