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