割り込みハンドラが実行されているときにコンテキスト切り替えを実行できないのはなぜですか?より具体的には、Linuxカーネルでは、中断されたプロセスのコンテキストで割り込みハンドラが実行されます。他のプロセスをスケジュールするために割り込みハンドラでコンテキストスイッチを実行できないのはなぜですか?割り込みハンドラのコンテキストスイッチ
4
A
答えて
7
マルチプロセッサでは、割り込みハンドラの実行中にコンテキストスイッチが確実に発生する可能性があります。実際、防止することは難しいでしょう。
単一CPUマシンでは、定義によって一度に1つのスレッドしか実行できません。 1つのレジスタセット、1つのALUなどしかありません。したがって、割り込みハンドラが実行されている場合、コンテキストスイッチを実行するリソースはありません。
割り込みハンドラが実際にコンテキストスイッチコードを呼び出してをにすることはできますか、私はうまく動作するシステムを想定しています。しかし、ほとんどの場合、これはあまり価値がなく、手配するのが難しいでしょう。 CPUが高い優先順位で実行されており、この優先順位を下げることができないか、割り込みレベル間の同期が失われます。 OSのクリティカルセクションはすでに割り込み実行と同期しており、複雑さが増します。さらに、スレッド・ユーザー・モード・プログラムと同様に、スタックを変更することでコンテキスト・スイッチが発生するので、割り込みから戻ってくるために割り込みスタックが必要なときにどうなるか想像するのは難しいです。
3
カップルの理由は、私はあなたの質問の意味に応じて、推測:
割り込みは、ハードウェアと対話するための一般的です。ハードウェアは一般的に時間に敏感なので、OSは何かの真ん中でそれを扱うことを止めることはできません。
割り込みは、特殊な割り込みコンテキストで発生し、通常のプロセスコンテキストでは発生しません。それはプロセスではないので、通常のプロセスと同じようにコンテキスト切り替えの対象にはなりません。
おそらく、より深く説明する必要がありますが、それは自分の理解の程度です。
関連する問題
- 1. オペレーティングシステムの割り込みハンドラ
- 2. カーネルモジュールプログラミング(割り込みハンドラ)
- 3. i2c割り込みハンドラstm32
- 4. GPIOピンlinux(arm)の割り込みハンドラ
- 5. ARM GIC Linaro GCCの割り込みハンドラ
- 6. CodeSourcery CS3割り込みハンドラのオーバーライド
- 7. 割り込みハンドラでargsを渡す
- 8. セルフ製キーボード割り込みハンドラ
- 9. トラップハンドラ、例外ハンドラ、割り込みハンドラとシステムコールとの違いは?
- 10. トリガーカーネル割り込みハンドラ:どのように?
- 11. linuxのアーム割り込みハンドラはどこですか?
- 12. Matlab - ハンドラを使用したprocessusの割り込み
- 13. Mspgccで割り込みハンドラ(ISR)を宣言するには?
- 14. Linuxコンテキストスイッチの内部:プロセスがタイマー割り込みの前に終了するとどうなりますか?
- 15. 割り込みハンドラがFIFOに書き込むことができます
- 16. TRAP、ソフトウェア割り込みとハードウェア割り込みの違いは?
- 17. 割り込みフラグと割り込み保留中のビットstm32
- 18. 割り込みsuper.onCreate()
- 19. 割り込みハンドラのカーネルバッファからユーザ空間バッファへのデータの移動
- 20. どこに計算を入れますか?割り込みハンドラまたはメインループの内部? (埋め込みリアルタイムアプリケーション)
- 21. Arduinoでの割り込み
- 22. Linuxの割り込みレイテンシー
- 23. C++の割り込みサービスルーチン
- 24. オペレーティングシステムの割り込み
- 25. クラス内の割り込み
- 26. 単純な割り込みハンドラ:request_irqがエラーコード-22を返します
- 27. 割り込みを処理するプログラムはどこにありますか?つまり、割り込みハンドラは保存されていますか?
- 28. 他の割り込みベクタ内の割り込みベクタを呼び出す
- 29. getTimeで動作する割り込み/割り込み関数の実行
- 30. ESP8266外部割り込み
返信いただきありがとうございます。私はschedule()を呼び出す割り込みハンドラを意味します。 「割り込みからの復帰のために割り込みスタックが必要なときに、どうやってこれが起こるのか想像するのは難しいですか? – Bandicoot
コンテキストスイッチでは、特定のカーネルスレッドがスイッチスタックを変更するスイッチコードを呼び出します。今度は、ALSOに切り替えるプロセスは、同様のコードを呼び出すことでコンテキスト切り替えコードを取得します。そのため、CPUは切り替え後に新しいスタックに戻ると、呼び出されたsleep関数から戻ります。それはCPUの優先順位を戻して下げる必要があるため、割り込みコードから発生することはありません。我々は、半分実行された割り込みルーチンのスタックを保存し、またCPUを割り込み優先順位のままにしておきたいとは思わないでしょう。 (これにより、さらに割り込みがロックされます)。 – DigitalRoss