6

以下是v3.5.4中的实时运行队列结构

struct rt_rq {
        struct rt_prio_array active;
        unsigned int rt_nr_running;
#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED
        struct {
                int curr; /* highest queued rt task prio */
#ifdef CONFIG_SMP
                int next; /* next highest */
#endif
        } highest_prio;
#endif
#ifdef CONFIG_SMP
        unsigned long rt_nr_migratory;
        unsigned long rt_nr_total;
        int overloaded;
        struct plist_head pushable_tasks;
#endif
        int rt_throttled;
        u64 rt_time;
        u64 rt_runtime;
        /* Nests inside the rq lock: */
        raw_spinlock_t rt_runtime_lock;

#ifdef CONFIG_RT_GROUP_SCHED
        unsigned long rt_nr_boosted;

        struct rq *rq;
        struct list_head leaf_rt_rq_list;
        struct task_group *tg;
 #endif
};

我已经了解某些数据成员代表什么,但我不完全确定以下数据成员:

a)rt_nr_migratory:(我认为)它是一个计数器,用于计算可以推送到其他 CPU 的任务数量

b)pushable_tasks是可以推送到其他运行队列的任务列表,如果它们没有要运行的东西。

如果我对上述条目有误,请纠正我。

c) rt_throttled, rt_time, rt_runtime, rt_nr_total, rt_nr_boosted: 我不明白这个有什么用。

还有为什么struct rq *rq;只在有组调度时才需要。我的意思是它的意义是什么。

4

1 回答 1

10

这是一个很难回答的问题,部分原因是它实际上是同时出现了六个复杂的问题。因此,为了帮助您理解这些部分,我在添加每个字段时进行了查找。阅读提交消息以及可能引入每个字段的补丁应该会让您更接近于理解它们存在的原因。

rt_nr_migratory在提交计划中添加:添加 RT-balance cpu-weight

pushable_tasks已添加到 commit sched: create "pushable_tasks" 列表中,以将推送限制为一次尝试

rt_throttledrt_time在 commit sched: rt time limit中添加。

rt_runtime在 commit sched: rt-group: smp balance中添加。

rt_nr_total在提交sched_rt 中添加:修复 rt 组调度上的过载错误

rt_nr_boosted已在 commit sched: rt-group: deal with PI中添加。(我相信这里的“PI”是指“优先级倒置”。)

rq已在 commit sched: rt group scheduling中添加。


我曾经git blame查明每一行是什么时候引入的,但在这种情况下它相当复杂,因为自从所有这些工作完成以来,调度程序源代码已经经历了两次重大重组。所以当我使用时git blame sched.h,它告诉我整个结构是一次性添加的,但它命名的提交实际上是在结构被移出时sched.c。然后我经常git blame <commit>~ -- sched.c看到 sched.c 在更改之前的样子。最后,对于我认为可能重要的每个提交,我使用git show <commit>.

于 2012-11-06T03:33:13.540 回答