
Linuxカーネルには、パラメーター再コンパイルせずにカーネルの動作を調整できるようにします。プリエンプション モデルを調整するためのパラメータはないようです。
-*- Preemption Model
No Forced Preemption (Server) (PREEMPT_NONE)
--> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
カーネル開発者はなぜそれらを選択するためのスイッチを追加しなかったのでしょうか?
答え1
might_sleep
プリエンプションは、(多数の)明示的なプリエンプション ポイント(カーネル内を参照)を使用して実装されます。これらのポイントの多くは、ややホット パス内にあります。完全なプリエンプション ( CONFIG_PREEMPT
) はさらに大きな影響を及ぼします。たとえば、スピンロックは、IRQ と同様に、プリエンプション カウントをチェックします (少なくとも、非 SMP カーネルでは)。
現在、選択されたプリエンプション モデルはコンパイル時に適用されます。その結果、強制プリエンプションがなければ、プリエンプション コードはカーネル内に残らず、スループットが最大になります。同様に、自発的プリエンプション カーネルでは、IRQ とカーネル エントリ ポイントでプリエンプション チェックは行われません。これを変更して、実行時にプリエンプションを変更できるようにすると、すべての構成で少なくとも起動時にプリエンプション設定をチェックする必要があり、最良の場合でもコストがかかります (例えばたとえプリエンプションがブート時の設定であり、「プリエンプションなし」設定によって関連する呼び出しサイトを修正できたとしても、結局は何もしないコードがコード キャッシュ内の貴重なスペースを占有することになります。