当前位置: 首页 > 面试题库 >

为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占

傅星光
2023-03-14
问题内容

我最近正在阅读 Linux Kernel Development ,并且我有一些有关禁用抢占的问题。

  1. 在第7章的“中断控制”部分中,它表示:

此外,禁用中断也会禁用内核抢占。

我还从书中了解到,在以下情况下可能会发生内核抢占:

当中断处理程序退出时,返回内核空间。
当内核代码再次被抢占时。
如果内核中的任务显式调用schedule()
如果该内核中的任务阻塞(导致对schedule()的调用)

但是我不能将禁用中断与这些情况联系起来。

  1. 据我所知,自旋锁会使用 preempt_disable() 函数禁用抢占。

在单核计算机上,自旋锁只是一个“禁用中断”或“引发IRQL”,它完全阻止了线程调度。

preempt_disable() 是否通过禁用中断来禁用抢占?


问题答案:

我不是调度专家,但是我想解释一下我如何看待它。这里有几件事。

  1. preempt_disable() 不会禁用IRQ 。它只是增加了一个thread_info->preempt_count变量。
  2. 禁用中断也会禁用抢占,因为调度程序在此之后不起作用-只能在单CPU计算机上使用。在SMP上这还不够,因为当您关闭一个CPU上的中断时,另一个/其他CPU仍会/异步地执行某些操作。
  3. 大锁(意味着-关闭所有CPU上的所有中断)正在极大地降低系统速度-这就是为什么不再使用它的原因。这也是preempt_disable()无法关闭IRQ的原因。

您可以看到什么是preempt_disable()。尝试以下操作:1.获取一个自旋锁。2.通话时间表()

在dmesg中,您会看到类似“ BUG:原子调度”的内容。当调度程序在原子(非抢先)上下文中检测到您的进程但自行调度时,就会发生这种情况。

祝好运。



 类似资料:
  • 内核抢占点 调度本质上体现了对CPU资源的抢占。对于用户进程而言,由于有中断的产生,可以随时打断用户进程的执行,转到操作系统内部,从而给了操作系统以调度控制权,让操作系统可以根据具体情况(比如用户进程时间片已经用完了)选择其他用户进程执行。这体现了用户进程的可抢占性(preemptive)。但如果把ucore操作系统也看成是一个特殊的内核进程或多个内核线程的集合,那ucore是否也是可抢占的呢?其

  • 我目前正在制造流程线上构建模型。目的是创建一个包含多台机器和操作员的模型。操作员在多个点执行各种任务。然而,我要求操作员遵循特定的工作时间表,并在错开的时间Rest。因此,我在每个代理内创建了时间表,以定制他们的Rest时间。 我面临的问题是,我需要操作员在Rest时间暂停当前的任务。因此,我一直在探索捕捉块中的抢占功能,但未能获得我所需要的。 我将在下面说明一个示例。假设运算符正在执行“rece

  • 问题内容: 用您自己的话解释,抢占是什么,对(linux)内核意味着什么? 拥有抢占式内核有哪些优缺点? 问题答案: 抢占式多任务处理- 在单个处理器上运行多个进程/线程,从而产生一种幻觉,即它们实际上在为每个进程/线程分配了较小的多路复用时间片以在其中运行时同时运行。当一个进程被调度为不执行并等待该进程/线程被“抢占”时,下次运行。 抢占式内核是可以在执行代码中间中断的内核(例如,响应系统调用)

  • 问题内容: 我读到Linux内核是抢占式的,这与大多数Unix内核不同。那么,内核抢占到底意味着什么呢? 一些类比或示例将比纯理论解释更好。 添加2018年1月1日-11:00 AM 抢占式只是多任务处理的一种范例。还有其他类似协作多任务处理。通过比较它们可以更好地理解。 问题答案: 想象一下抢占式多任务的简单视图。我们有两个用户任务,它们都一直在运行,而没有使用任何I / O或执行内核调用。这两

  • 我想只支持纵向视图。如何让React Native应用程序不自动旋转?我尝试搜索留档和Github问题,但没有找到任何有用的东西。

  • 问题内容: 我知道linux确实做了嵌套的中断,其中一个中断可以“抢占”另一个中断,但是其他任务呢。 我只是想了解linux如何处理中断。它们可以被其他用户任务/内核任务抢占吗? 问题答案: 简单答案:中断只能被更高优先级的中断所中断。 因此, 如果 中断的优先级低于内核调度程序中断优先级或用户任务中断优先级,则中断可以被内核或用户任务中断。 注意,“用户任务”是指 用户定义的中断 。