linux – 了解rt_rq(实时runqueue)内核中数据成员的使用
以下是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;仅在组调度存在时才需要.我的意思是它的意义. 解决方法
这是一个难以回答的问题,部分原因是因为它实际上是六个复杂的问题.因此,为了帮助您理解每个部分,我已经查找了每个字段的添加时间.阅读提交消息以及可能引入每个字段的补丁应该让您更接近理解它们为什么存在.
rt_nr_migratory在commit sched: add RT-balance cpu-weight中添加. pushable_tasks在commit sched: create “pushable_tasks” list to limit pushing to one attempt中添加. 在提交sched: rt time limit中添加了rt_throttled和rt_time. rt_runtime在提交sched: rt-group: smp balancing中添加. 在提交sched_rt: Fix overload bug on rt group scheduling中添加了rt_nr_total. 在提交sched: rt-group: deal with PI中添加了rt_nr_boosted.(我认为“PI”在这里意味着“优先级倒置”.) rq在提交sched: rt group scheduling中添加. 我使用git blame来找出每行引入的时间,但在这种情况下它非常复杂,因为调度程序源代码经历了两次重大的重组,因为所有这些工作都完成了.因此,当我使用git blame sched.h时,它告诉我整个结构都是一次性添加的,但是它的命名提交实际上是在结构移出sched.c之后.然后我使用git blame< commit>? – sched.c来查看sched.c在更改之前的样子.最后,对于我认为可能很重要的每个提交,我使用git show< commit>进行了双重检查. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |