查看 c 运算符优先级http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
The ->
运算符的优先级高于前缀++
,因此这个特定条件可以写成:
if (--(p->rt.time_slice))
换句话说,减少的是时间片,而不是指针。
The queued
参数在这里可能显得无用,但它有一个存在的理由。具体注意哪里task_tick_rt()
是从调用的。它唯一的参考是当它被分配给.task_tick
函数指针在rt_sched_class
的实例struct sched_class
:
http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991 http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991
所以我们看到每个调度算法都有自己的struct sched_class
内核将调用它来进行调度服务的函数向量。如果我们看看其他算法,我们会发现 CFS(完全公平调度)算法也有自己的实例struct sched_class
, named fair_sched_class
:
http://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179 http://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179
The .task_tick
粮安委个案中的成员指出task_tick_fair()
:
http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785 http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785
Note task_tick_fair()
does利用queued
范围。所以当.task_tick
成员被召唤到(here http://lxr.free-electrons.com/source/kernel/sched/core.c#L393 and here http://lxr.free-electrons.com/source/kernel/sched/core.c#L2179),传入 0 或 1queued
范围。所以虽然task_tick_rt()
不使用它,则queued
参数仍然必须是它们的,因此函数指针类型在struct sched_class
函数向量全部匹配。
简而言之,struct sched_class
函数向量指定调度算法和内核其余部分之间的接口。这queued
参数是给定算法应该选择使用它的参数,但在循环的情况下,它会被忽略。