私は Linux を初めて使用し、Rubini & Corbet による Linux デバイス ドライバーの本を読んでいます。に関連する 1 つのステートメントで混乱していspinlocks
ます。本の状態
非プリエンプティブ ユニプロセッサ システムがロックでスピンに入った場合、永久にスピンします。他のスレッドが CPU を取得してロックを解放することはできません。このため、プリエンプションが有効になっていないユニプロセッサ システムでのスピンロック操作は、IRQ マスキング ステータスを変更するものを除いて、何もしないように最適化されています。
さらに本の状態
カーネル プリエンプションのケースは、スピンロック コード自体によって処理されます。カーネル コードがスピンロックを保持している場合は常に、関連するプロセッサでプリエンプションが無効になります。単一プロセッサ システムでも、競合状態を回避するために、この方法でプリエンプションを無効にする必要があります。
質問 : ユニプロセッサ システムで、カーネル コード (ユーザー プロセスに代わって実行) がスピンロックを保持するたびにカーネル プリエンプションが無効になっている場合、別のプロセスが実行する機会を得て、スピンロックを取得しようとする可能性はありますか? カーネル コードがスピンロックを保持するたびに Linux カーネルがカーネル プリエンプションを無効にするのはなぜですか?