![为什么Linux的抢占模型不能通过内核参数改变?](https://linux22.com/image/139176/%E4%B8%BA%E4%BB%80%E4%B9%88Linux%E7%9A%84%E6%8A%A2%E5%8D%A0%E6%A8%A1%E5%9E%8B%E4%B8%8D%E8%83%BD%E9%80%9A%E8%BF%87%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0%E6%94%B9%E5%8F%98%EF%BC%9F%20.png)
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 和内核入口点中没有任何抢占检查。更改此设置以便可以在运行时更改抢占意味着所有配置都必须检查抢占设置(至少在启动时),并且即使在最好的情况下也会遭受一些成本(例如,即使抢占是启动时设置,并且“无抢占”设置可以修补相关的调用站点,您最终仍然会得到不执行任何操作的代码,占用代码缓存中的宝贵空间)。