0

最近、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 で定義されているため、rt_sched_class に fair_sched_class とは何かを「伝える」インクルードまたは何かがあると思います。

しかし、ファイル全体を検索しましたが、sched_rt.c に「include」がまったく見つかりません。では、なぜ sched_rt.c で fair_sched_class の値を取得できるのでしょうか? ありがとう!

4

2 に答える 2

1

$LINUX/kernel/sched/rt.cincludesには、スケジューラ クラスのインスタンス変数の前方宣言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 ファイル) に分散されます。

また、通信は行われません。これは、コンパイル時に初期化子が定義された単一のリンク リストです。

于 2013-03-25T00:46:43.217 に答える
0

kernelnewbiesをよく見るか、 LWNのスケジューラー開発に関する記事をチェックしてください。これは非常に複雑な領域であり、コードは急速に変化します。つまり、私たち血まみれのアマチュアではなく、専門家と話してください。

于 2013-03-25T02:59:05.943 に答える