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とカーネルエントリポイントのプリエンプションチェックはありません。実行時にプリエンプションを変更できるようにこの設定を変更することは、すべての構成が(少なくとも起動時に)プリエンプション設定を確認する必要があります。例えば開始時にプリエンプションが設定され、「プリエンプションなし」設定が関連する呼び出しサイトにパッチを適用しても、まだ何もしないコードで終わり、コードキャッシュの貴重なスペースを占有します。