我最近阅读的是linux内核2.6.26.5的代码,并试图实现另一个调度程序类。但是,我对Linux内核如何处理不同调度器类之间的通信感到困惑。 例如,在sched_rt.c,rt_sched_class定义为:Linux调度程序类如何相互通信
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 */
......
字段 “下一个” 是指向下一个sched_class,这是fair_sched_class这里。
我很困惑它是怎么知道什么是fair_sched_class。由于fair_sched_class是在另一个文件shed_fair.c中定义的,我会假设有一个include或者什么“告诉”rt_sched_class什么是fair_sched_class。
但是,我搜索了整个文件,但在sched_rt.c中找不到“include”。所以我想知道它是如何工作的,为什么我们可以在sched_rt.c中获得fair_sched_class的价值? 谢谢!
嗨,非常感谢您的帮助!但你发布的代码似乎来自更新版本的Linux。我正在使用linux 2.26.5,并且在sched_rt.c中没有include .. – Dumpling 2013-03-25 01:09:01
@Dumpling:只要查找一些'extern'前向声明,告诉编译器,其他编译单元可以使用哪些。 – datenwolf 2013-03-25 01:46:50
嗨,非常感谢!我终于明白了为什么。 sched_rt.c文件不是单独编译的。它与sched_fair.c一起被包含在sched.c中。所以当编译器编译sched.c时,变量存在:) – Dumpling 2013-03-25 05:42:48