了解rt_rq(实时runqueue)内核中数据成员的使用

时间:2012-10-26 04:32:16

标签: linux linux-kernel kernel

以下是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_throttledrt_timert_runtimert_nr_totalrt_nr_boosted:我不明白这是什么用途。

另外,为什么struct rq *rq;仅在组调度存在时才需要。我的意思是它的重要性。

1 个答案:

答案 0 :(得分:6)

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

提交sched: add RT-balance cpu-weight中添加了

rt_nr_migratory

提交sched: create "pushable_tasks" list to limit pushing to one attempt中添加了

pushable_tasks

在提交sched: rt time limit中添加了

rt_throttledrt_time

提交sched: rt-group: smp balancing中添加了

rt_runtime

提交sched_rt: Fix overload bug on rt group scheduling中添加了

rt_nr_total

提交sched: rt-group: deal with PI中添加了

rt_nr_boosted。 (我认为“PI”在这里意味着“优先倒置”。)

提交sched: rt group scheduling中添加了

rq


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