【问题标题】:What is the relation between reentrant kernel and preemptive kernel?可重入内核和抢占内核之间有什么关系?
【发布时间】:2019-02-23 00:36:37
【问题描述】:

可重入内核和抢占内核是什么关系?

如果内核是抢占式的,它必须是可重入的吗? (我猜是的)

如果内核是可重入的,它必须是抢占式的吗? (我不确定)

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

我想我的问题一般是关于操作系统概念的。但如果重要的话,我主要对 Linux 内核感兴趣,在阅读 Understanding the Linux Kernel 时会遇到这两个概念。

【问题讨论】:

  • 有人将不得不定义这些术语以获得真正的答案。出于实际目的,所有理性内核都将像您的链接中描述的那样可重入。我见过具有自定义操作系统的系统,根据该定义可能无法重入,但这些都是古怪的。

标签: linux-kernel operating-system reentrancy preemption


【解决方案1】:

什么是可重入内核:

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

什么是内核抢占:

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

我能想象一个不可重入的抢占式内核吗?几乎没有,但我可以。让我们考虑一个示例:某个线程执行系统调用。进入内核时,它需要一个大内核锁,并禁止除调度程序定时器 irq 之外的所有中断。之后,该线程在内核中被调度程序抢占。现在我们可以切换到另一个用户空间线程。这个进程在用户空间做一些工作,然后进入内核,获取大内核锁并休眠等。在实践中,这个解决方案似乎无法实现,因为在很长的时间间隔内禁止中断会导致巨大的延迟。

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

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

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 2018-06-10
    • 2017-03-05
    • 2019-02-20
    • 2015-03-05
    • 1970-01-01
    • 2018-09-16
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多