2011-01-19 39 views
4

割り込みハンドラが実行されているときにコンテキスト切り替えを実行できないのはなぜですか?より具体的には、Linuxカーネルでは、中断されたプロセスのコンテキストで割り込みハンドラが実行されます。他のプロセスをスケジュールするために割り込みハンドラでコンテキストスイッチを実行できないのはなぜですか?割り込みハンドラのコンテキストスイッチ

答えて

7

マルチプロセッサでは、割り込みハンドラの実行中にコンテキストスイッチが確実に発生する可能性があります。実際、防止することは難しいでしょう。

単一CPUマシンでは、定義によって一度に1つのスレッドしか実行できません。 1つのレジスタセット、1つのALUなどしかありません。したがって、割り込みハンドラが実行されている場合、コンテキストスイッチを実行するリソースはありません。

割り込みハンドラが実際にコンテキストスイッチコードを呼び出してにすることはできますか、私はうまく動作するシステムを想定しています。しかし、ほとんどの場合、これはあまり価値がなく、手配するのが難しいでしょう。 CPUが高い優先順位で実行されており、この優先順位を下げることができないか、割り込みレベル間の同期が失われます。 OSのクリティカルセクションはすでに割り込み実行と同期しており、複雑さが増します。さらに、スレッド・ユーザー・モード・プログラムと同様に、スタックを変更することでコンテキスト・スイッチが発生するので、割り込みから戻ってくるために割り込みスタックが必要なときにどうなるか想像するのは難しいです。

+0

返信いただきありがとうございます。私はschedule()を呼び出す割り込みハンドラを意味します。 「割り込みからの復帰のために割り込みスタックが必要なときに、どうやってこれが起こるのか想像するのは難しいですか? – Bandicoot

+0

コンテキストスイッチでは、特定のカーネルスレッドがスイッチスタックを変更するスイッチコードを呼び出します。今度は、ALSOに切り替えるプロセスは、同様のコードを呼び出すことでコンテキスト切り替えコードを取得します。そのため、CPUは切り替え後に新しいスタックに戻ると、呼び出されたsleep関数から戻ります。それはCPUの優先順位を戻して下げる必要があるため、割り込みコードから発生することはありません。我々は、半分実行された割り込みルーチンのスタックを保存し、またCPUを割り込み優先順位のままにしておきたいとは思わないでしょう。 (これにより、さらに割り込みがロックされます)。 – DigitalRoss

3

カップルの理由は、私はあなたの質問の意味に応じて、推測:

  1. 割り込みは、ハードウェアと対話するための一般的です。ハードウェアは一般的に時間に敏感なので、OSは何かの真ん中でそれを扱うことを止めることはできません。

  2. 割り込みは、特殊な割り込みコンテキストで発生し、通常のプロセスコンテキストでは発生しません。それはプロセスではないので、通常のプロセスと同じようにコンテキスト切り替えの対象にはなりません。

おそらく、より深く説明する必要がありますが、それは自分の理解の程度です。

関連する問題