可重入内核与抢占内核之间有什么关系?
如果内核是抢占式的,是否必须是可重入的? (我想是的)
如果内核是可重入的,它是否必须具有抢占性? (我不确定)
我已经读过https://stackoverflow.com/a/1163946,但不确定这两个概念之间是否存在联系。
我想我的问题通常与操作系统概念有关。但是,如果有关系,我主要对Linux内核感兴趣,并且在阅读《理解Linux内核》时会遇到两个概念。
谢谢。
答案 0 :(得分:1)
什么是可重入内核:
顾名思义,可重入内核是允许 在任何给定的内核模式下都将执行多个进程 时间点,也不会造成任何一致性问题 在内核数据结构中。
什么是内核抢占:
内核抢占是一种主要用于整体式和混合式的方法 所有或大多数设备驱动程序在内核空间中运行的内核, 从而允许调度程序强制执行上下文 切换(即抢先调度;代表可运行且更高级别的 优先级进程)在驱动程序或内核其他部分期间 执行,而不是协同等待驱动程序或内核 函数(例如系统调用)以完成其执行并返回 调度程序对处理器的控制。
我能想象一个不可重入的抢占式内核吗?很难,但是我可以。让我们考虑一个示例:某个线程执行系统调用。进入内核时,它将占用很大的内核锁,并禁止除调度程序计时器irq外的所有中断。之后,调度程序会在内核中抢占该线程。现在我们可以切换到另一个用户空间线程。这个过程在用户空间中做一些工作,然后进入内核,获得大的内核锁并进入睡眠状态等等。实际上,由于在较长的时间间隔内禁止中断而导致的巨大延迟,因此该解决方案似乎无法实施。
我能想象不是抢先的可重入内核吗?为什么不?只需在内核中使用协作抢占即可。线程1进入内核并在一段时间后调用thread_yield()
。线程2进入内核,这是它自己的工作,也许不调用另一个thread_yield。这里没有什么特别的。
对于linux内核,它是绝对可重入的,可以通过CONFIG_PREEMPT配置内核抢占。自愿抢占也是可能的,还有许多其他不同的选择。