2013-03-24 61 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