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

Ama*_*tam 6 linux kernel linux-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
};
Run Code Online (Sandbox Code Playgroud)

我已经了解了一些数据成员所代表的含义,但我不完全确定以下数据成员:

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

b)pushable_tasks是可以推送到其他运行队列的任务列表,如果它们没有任何运行的话.

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

C) ,rt_throttled,rt_time,rt_runtime,rt_nr_total:rt_nr_boosted我不明白什么用的这个.

另外,struct rq *rq;只有在进行组调度时才需要.我的意思是它的意义.

Jam*_*arp 8

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

rt_nr_migratory在提交sched中添加:添加RT-balance cpu-weight.

pushable_tasks在提交sched中添加:创建"pushable_tasks"列表以限制推送到一次尝试.

rt_throttledrt_time在commit sched中添加:rt时间限制.

rt_runtime在提交sched中添加:rt-group:smp balance.

rt_nr_total在commit sched_rt中添加:修复rt组调度的重载错误.

rt_nr_boosted在提交sched中添加:rt-group:处理PI.(我认为"PI"在这里意味着"优先倒置".)

rq在提交sched中添加:rt组调度.


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

  • 尽管这无关紧要,但您能告诉我如何找到此类提交消息或此类内容的教程吗,这将非常有帮助。我的意思是你是如何找到这些链接的。 (2认同)
  • 这不是不相关的。我可能应该在开始时附上有关我如何回答问题的注释。完毕! (2认同)
  • `--` 此处确保将 before 参数视​​为提交哈希,并将 after 参数视为文件名。否则,git 经常会尝试猜测参数是提交还是文件名,如果您同时拥有同名的文件和分支,它可能会猜错。通常这没有任何区别,但这是一个很好的习惯。 (2认同)