linux调度程序类如何相互通信

时间:2013-03-24 23:43:42

标签: c linux

我最近正在阅读linux内核2.6.26.5的代码并尝试实现另一个调度程序类。但是,我对linux内核如何处理不同调度程序类之间的通信感到困惑。 例如,在sched_rt.c中,rt_sched_class定义为:

static const struct sched_class rt_sched_class = {
    .next               = &fair_sched_class,
    .enqueue_task       = enqueue_task_rt,
    .dequeue_task       = dequeue_task_rt,
    .yield_task         = yield_task_rt,
#ifdef CONFIG_SMP
    .select_task_rq     = select_task_rq_rt,
#endif /* CONFIG_SMP */ 
......

字段“next”指向下一个sched_class,这里是fair_sched_class。

我对如何知道什么是fair_sched_class感到困惑。由于fair_sched_class在另一个文件shed_fair.c中定义,我认为有一个include或者“tell”rt_sched_class什么是fair_sched_class。

但是,我搜索了整个文件,但根本找不到sched_rt.c中的“include”。所以我想知道它是如何工作的,为什么我们可以在sched_rt.c中获得fair_sched_class的值?    谢谢!

2 个答案:

答案 0 :(得分:1)

$LINUX/kernel/sched/rt.c包含sched.h,其中包含调度程序类实例变量的多个extern前向声明:

extern const struct sched_class stop_sched_class;
extern const struct sched_class rt_sched_class;
extern const struct sched_class fair_sched_class;
extern const struct sched_class idle_sched_class;

然后,变量的实际定义将分散在调度程序编译单元(.c文件)上。

此外还没有进行通信,这只是一个链接列表,在编译时定义了初始化器。

答案 1 :(得分:0)

更好地了解kernelnewbies或查看LWN对调度程序开发的报道。它是非常复杂区域,代码快速变化。即,与专家交谈,而不是我们血腥的业余爱好者。