完全なコンテキストを提供するために、ユニプロセッサである ARM Cortex A8 ベースの SoC で SMP Linux (3.0.1-rt11) を実行しているという観察から私の議論を始めました。SMP サポートを無効にすることでパフォーマンスが向上するかどうか知りたいと思っていました。はいの場合、ドライバーと割り込みハンドラーにどのような影響がありますか。
いくつか読んだところ、スピンロックとカーネル プリエンプションという 2 つの関連トピックに出くわしました。私はもう少しグーグルと読書をしましたが、今回は古くて矛盾した答えがほとんどありません. それで、stackoverflowを試してみようと思いました。
私の疑問/質問の起源は、Linuxデバイスドライバーの第3版第5章のこのパラです。
スピンロックは、その性質上、マルチプロセッサ システムでの使用を意図していますが、プリエンプティブ カーネルを実行するユニプロセッサ ワークステーションは、並行性に関する限り、SMP のように動作します。非プリエンプティブ ユニプロセッサ システムがロックでスピンに入った場合、永久にスピンします。他のスレッドが CPU を取得してロックを解放することはできません。このため、プリエンプションが有効になっていないユニプロセッサ システムでのスピンロック操作は、IRQ マスキング ステータスを変更するものを除いて、何もしないように最適化されています。コードが SMP システムで実行されるとはまったく予想していない場合でも、プリエンプションのために、適切なロックを実装する必要があります。
私の疑問/質問は次のとおりです。
a) Linux カーネルはデフォルトでカーネル空間でプリエンプティブですか? はいの場合、このプリエンプションはプロセスのみに制限されていますか、それとも割り込みハンドラもプリエンプトできますか?
b) Linux カーネル (ARM 上) はネストされた割り込みをサポートしていますか? はいの場合、各割り込みハンドラー (上半分) は独自のスタックを持ちますか、それとも同じ 4k/8k カーネル モード スタックを共有しますか?
c) SMP ( CONFIG_SMP
) とプリエンプション ( CONFIG_PREEMPT
) を無効にした場合、ドライバーと割り込みハンドラーのスピンロックは意味がありますか?
d) 上半分の実行中に発生した割り込みをカーネルがどのように処理するか、つまり、それらは無効化またはマスクされますか?
いくつかのグーグルの後、私はこれを見つけました:
CONFIG_SMP および CONFIG_PREEMPT なしでコンパイルされたカーネルの場合、スピンロックはまったく存在しません。これは優れた設計上の決定です。他の誰も同時に実行できない場合、ロックを設定する理由はありません。
カーネルが CONFIG_SMP なしでコンパイルされているが、CONFIG_PREEMPT が設定されている場合、スピンロックはプリエンプションを無効にするだけで、競合を防ぐのに十分です。ほとんどの場合、プリエンプションは SMP と同等と考えることができ、個別に心配する必要はありません。
しかし、ソースにはカーネルのバージョンや日付はありません。最新の Linux カーネルに対してまだ有効かどうかを確認できますか?