web-dev-qa-db-ja.com

Linuxではどのように割り込みがキューに入れられますか?

ハードウェアとソフトウェアの割り込みフローで、キューアップはどのように処理されますか?より正確には、私は疑問を持っています

2つのCPUを搭載したマシンがあるシナリオを考えてみましょう。 CPU1はプロセスP1を処理し、CPU2はプロセスP2を処理しています。プロセスP3は実行を待機しています。 CPU1はハードウェア割り込み(I1)を受け取りました。そのため、CPU1コンテキストはI1の割り込みサービスルーチン(ISR)に切り替わりました。

注:割り込みの下半分を無視して、すべての割り込みに上半分しかないと見なすことができます。

  • I1の割り込み処理が完了すると、 P1が再度スケジュールされることは保証されますか、それともP3がスケジュールされる可能性がありますか?
  • プロセスP1(ハードウェア割り込みによりCPU1から削除されます)は、CPU2が空いている場合に占有しますか?
  • I1の割り込みハンドラーが割り込みをマスクしていない場合、2番目の割り込みI2はどうなりますか?それがキューに入る場合、誰がそのキューを覚えますか?
  • I1の割り込みハンドラーがすべての割り込みをマスクしている場合、2番目の割り込みI2はどうなりますか?

通常、割り込みハンドラーはできる限り短くなるように設計されており、実際の処理コードはプロセスのようなコンテキストで呼び出されます。ハンドラーはソースを決定し、ソフトウェアにキューエントリを追加し、後で割り込みソースを無効にします。 CPUが割り込み処理から戻ると、割り込みハンドラのキューが最初に処理され、次に「現在の」プロセスが再開されます。

キューの評価中に呼び出されるハンドラーは、どのプロセスが「現在」であるかを変更できます。最も明白な例は、タイムスライスがアップしていることを示すタイマー割り込みですが、着信イベントは、優先度の高いプロセスを実行可能にして、スケジュールすることもできます。

マルチプロセッサシステムには、明示的な割り込みルーティングがあり、通常は関連するCPUにのみルーティングされる専用タイマーIRQと、「優先」CPU(キャッシュの局所性を向上させるため)またはロードバランシングアプローチが適用されるハードウェア割り込みがあります。割り込みコントローラはそれらを確実に分配します。

ハードウェアの観点からは、割り込みには常にフラグが付けられ、キューには入れられないため、処理されるまで割り込みを再送信できません(したがって、レートが高すぎる場合に割り込みを失うハードウェアの制限はありません)が、OSは通常、ソフトウェアでキューに入れるため、「実際の」IRQハンドラーで費やす時間はできるだけ少なくなります(キューに入れることができるのは各ソースのインスタンスが1つだけなので、このキューの長さは制限されます)。

したがって、1つの特定のハードウェアとインターフェースする「下半分」ハンドラーは、別の着信割り込みによって割り込みを受ける可能性がありますが、それは、2番目の割り込みをキューに追加することだけです。次に、最初の割り込みの下半分のハンドラーが再開され、それが戻ると、2番目の割り込みの下半分のハンドラーが呼び出され、下半分のハンドラーのキューが空になるとすぐに、現在のユーザー空間プロセスが実行されました。

2
Simon Richter

次に実行されるプロセスにはno保証があります。割り込みが処理されるたびに、カーネルは次に何をスケジュールするかを決定します(実行可能になった優先順位の高いプロセス、現在のプロセスの優先順位が下がり、別のプロセスの順番が上がります...)。キャッシュの内容はとにかく撃たれるので、実行中のプロセスを常に再開することはあまり意味がありません。そして、何が起こるかは厳密には内部カーネルの問題であり、使用されるポリシーは警告なしに変更される可能性があります。

1
vonbrand