可重入内核与抢占内核之间有什么关系?

时间:2018-09-18 22:54:12

标签: linux-kernel operating-system reentrancy preemption

可重入内核与抢占内核之间有什么关系?

如果内核是抢占式的,是否必须是可重入的? (我想是的)

如果内核是可重入的,它是否必须具有抢占性? (我不确定)

我已经读过https://stackoverflow.com/a/1163946,但不确定这两个概念之间是否存在联系。

我想我的问题通常与操作系统概念有关。但是,如果有关系,我主要对Linux内核感兴趣,并且在阅读《理解Linux内核》时会遇到两个概念。

谢谢。

1 个答案:

答案 0 :(得分:1)

什么是可重入内核:

  

顾名思义,可重入内核是允许   在任何给定的内核模式下都将执行多个进程   时间点,也不会造成任何一致性问题   在内核数据结构中。

什么是内核抢占:

  

内核抢占是一种主要用于整体式和混合式的方法   所有或大多数设备驱动程序在内核空间中运行的内核,   从而允许调度程序强制执行上下文   切换(即抢先调度;代表可运行且更高级别的   优先级进程)在驱动程序或内核其他部分期间   执行,而不是协同等待驱动程序或内核   函数(例如系统调用)以完成其执行并返回   调度程序对处理器的控制。

我能想象一个不可重入的抢占式内核吗?很难,但是我可以。让我们考虑一个示例:某个线程执行系统调用。进入内核时,它将占用很大的内核锁,并禁止除调度程序计时器irq外的所有中断。之后,调度程序会在内核中抢占该线程。现在我们可以切换到另一个用户空间线程。这个过程在用户空间中做一些工作,然后进入内核,获得大的内核锁并进入睡眠状态等等。实际上,由于在较长的时间间隔内禁止中断而导致的巨大延迟,因此该解决方案似乎无法实施。

我能想象不是抢先的可重入内核吗?为什么不?只需在内核中使用协作抢占即可。线程1进入内核并在一段时间后调用thread_yield()。线程2进入内核,这是它自己的工作,也许不调用另一个thread_yield。这里没有什么特别的。

对于linux内核,它是绝对可重入的,可以通过CONFIG_PREEMPT配置内核抢占。自愿抢占也是可能的,还有许多其他不同的选择。