
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
)影響更大;例如,自旋鎖檢查搶佔計數(至少在非 SMP 核心上),IRQ 也是如此。
目前,所選的搶佔模型是在編譯時應用的;因此,在沒有強制搶佔的情況下,任何搶佔程式碼都不會在核心中存活,並且您可以獲得最大吞吐量。同樣,自願搶佔核心在 IRQ 和核心入口點中沒有任何搶佔檢查。更改此設定以便可以在運行時更改搶佔意味著所有配置都必須檢查搶佔設定(至少在啟動時),並且即使在最好的情況下也會遭受一些成本(例如,即使搶佔是啟動時設置,並且「無搶佔」設置可以修補相關的呼叫站點,您仍然會得到不執行任何操作的程式碼,佔用程式碼快取中的寶貴空間)。