2012-01-28 36 views
4

プロセスkeventdを考えてみましょう。カーネルモードでは、すべての時間を費やしています。 私が知る限り、Linuxはコンテキストスイッチが期限切れかどうかを確認しますが、プロセスはカーネルモードからユーザーモードに切り替わります。私が知る限り、keventdはカーネルモードからユーザーモードに切り替えることはありません。 Linuxカーネルはいつスイッチを切るべきかを知っていますか?Linuxのコンテキスト切り替えカーネルプロセス

答えて

4

あなたが言ったようにカーネルを実行していて、プロセスが明示的なユーザ - カーネルモードの切り替えで切り替えられるかどうかをチェックするだけの場合、次のループはコンピュータのコアをロックします:

while (1); 

明らかに、これは通常のデスクトップオペレーティングシステムでは発生しません。理由はなぜプリエンプションです。プロセスがそのタイムスライスのために実行された後、カーネルはアラームを取得し、ステップインし、必要に応じてコンテキストを強制的に切り替えます。

プリエンプションは原則としてカーネルプロセスでも機能します。しかし、私はそれが何であるか分かりませんkeventd - 定期的にタイムスライスを自発的に放棄する可能性がより高いです(特に、カーネルを非ゼロにするように設定することができるので、同じ効果のユーザスペース呼び出しであるsched_yieldを参照してください)先制。それはカーネルプロセスの特権です。

+0

(1)はscheduler_tick()ごとにカーネルモードに切り替えるので、プロセスのタイムスライスがカーネルモードになっている間にカーネルはそれを知り、p-> need_resched = 1を実行します。ユーザーモードに切り替えるには、schedule()を呼び出します。 – Shmoopy

+0

@Shmoopy正解!あなたの元の投稿から、プログラムがシステムコールをしていないときに起こる暗黙的なカーネルモード遷移があることを理解したので、私は明確にしました。私は私の答えに "明示的"という言葉を追加します。もちろん、 'scheduler_tick'はあなたがカーネル空間にいても起動します。そして、あなたはticklessカーネルを持つことができます... – Borealid

+0

keventd(またはそのようなカーネルプロセスについては)のscheduler_tick()私の質問は、いつLinuxカーネルがそのフラグをチェックするかは決してカーネルとカーネルの関係がない場合です。スケジューラータグ(他のものの中でも)は:if(! - p-> time_slice){p-> need_recsched =カーネルプロセスのユーザ遷移(この例ではkeventd)。 – Shmoopy

関連する問題