没有CONFIG_PREEMPT,内核不能抢占?

没有CONFIG_PREEMPT,内核不能抢占?

我检查了CentOS 8/Redhat 8和Ubuntu 22.04,它们的默认内核设置CONFIG_PREEMPT都没有设置:

CONFIG_PREEMPT is not set

按照我的理解,内核默认应该能够抢占。不是吗?

答案1

可以阅读CONFIG_PREEMPT配置项的说明这里,其中说:

此选项通过使所有内核代码(不在关键部分中执行)可抢占来减少内核的延迟。这允许通过允许非自愿抢占低优先级进程来对交互事件做出反应,即使该进程处于内核模式下执行系统调用并且不会到达自然抢占点。这使得应用程序即使在系统处于负载状态时也可以更“平稳”地运行,但代价是吞吐量稍低,并且内核代码的运行时开销也很小。

通常,只有用户空间代码是可抢占的。启用后CONFIG_PREEMPT,在内核空间中执行的代码是预先规定的。

相关内容