我检查了CentOS 8/Redhat 8和Ubuntu 22.04,它们的默认内核设置CONFIG_PREEMPT都没有设置:
CONFIG_PREEMPT is not set
按照我的理解,内核默认应该能够抢占。不是吗?
答案1
可以阅读CONFIG_PREEMPT
配置项的说明这里,其中说:
此选项通过使所有内核代码(不在关键部分中执行)可抢占来减少内核的延迟。这允许通过允许非自愿抢占低优先级进程来对交互事件做出反应,即使该进程处于内核模式下执行系统调用并且不会到达自然抢占点。这使得应用程序即使在系统处于负载状态时也可以更“平稳”地运行,但代价是吞吐量稍低,并且内核代码的运行时开销也很小。
通常,只有用户空间代码是可抢占的。启用后CONFIG_PREEMPT
,在内核空间中执行的代码是还预先规定的。