2013-03-24 19 views
0

我最近阅读的是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的价值? 谢谢!

回答

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文件)。

此外,没有任何沟通发生,这只是一个单一的链表,在编译时定义了初始值。

+0

嗨,非常感谢您的帮助!但你发布的代码似乎来自更新版本的Linux。我正在使用linux 2.26.5,并且在sched_rt.c中没有include .. – Dumpling 2013-03-25 01:09:01

+0

@Dumpling:只要查找一些'extern'前向声明,告诉编译器,其他编译单元可以使用哪些。 – datenwolf 2013-03-25 01:46:50

+0

嗨,非常感谢!我终于明白了为什么。 sched_rt.c文件不是单独编译的。它与sched_fair.c一起被包含在sched.c中。所以当编译器编译sched.c时,变量存在:) – Dumpling 2013-03-25 05:42:48

0

更好看看kernelnewbies或查看LWN对调度程序开发的报道。这是一个复杂的区域,代码变化很快。也就是说,与专家交谈,而不是对我们血腥的业余爱好者。

+0

感谢您的建议!我也是linux新手......这是我的操作系统课程任务。 Soooo努力.. – Dumpling 2013-03-25 04:54:00