不了解Linux内核实时调度程序中某些函数的内部结构

时间:2013-12-08 05:09:12

标签: c linux linux-kernel scheduling scheduler

我正在查看实时调度程序/kernel/sched/rt.cupdate_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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我强烈建议你探索cscope和/或grok的奇迹。您可以在其中键入或单击标识符并查看定义。

这是经典的linux代码:紧凑,重点和可读性。一些宏的使用使得它更难理解,但一切都有有意义的名称。

对于你说'没有意义'的部分:for_each_sched_rt_entity是一个扩展为for循环的宏。 它使代码更紧凑但更难理解。 基本上,如果我们任务中的任何rq已经用完了运行时间 然后将任务抛回调度程序以将其设置为运行 再过一次。

轻松自负。