为什么中断处理程序(ISR)无法休眠?

问题描述 投票:0回答:3

我很困惑为什么中断处理程序不能休眠?我对同一问题有两种看法:-

  1. 中断处理程序不可调度?因为它没有task_struct。

  2. 如果处理程序休眠,则系统可能会挂起,因为系统时钟中断被屏蔽并且无法调度休眠进程。

中断处理程序是否可调度,
但是当较低优先级的系统时钟中断
被这些更高优先级的中断屏蔽了
,
无法安排?

请给我一个很好的例子。

c linux interrupt
3个回答
1
投票

当中断发生时,处理器进入异常状态(中断上下文)。 当发生这种情况时,调度程序将被禁用,直到处理器退出此状态。如果您将一个任务置于睡眠状态,该任务将进入等待队列并告诉调度程序将另一个任务出队。如果它发生在中断上下文中,则在我们完成此上下文之前没有调度程序,并且处理器会挂起,因为我们从未完成中断。到底发生什么取决于处理器。 一种解决方案是在线程中运行实际的中断代码 - 这称为线程中断,这是实时补丁中使 Linux 成为“硬实时”的配置之一


1
投票

您无法在 Linux 中的中断处理程序中休眠,因为它们没有执行线程的支持。换句话说,它们不是可调度的实体。

大多数系统将中断处理分为两半,通常称为上半部和下半部。上半部分运行得非常快,中断发生时正在执行的任何内容(实际上是运行)——上半部分本身没有线程。因此,上半部分无法睡眠,因为睡眠完成后没有任何内容可以安排回来。

来自Quora上的罗伯特·洛夫


0
投票

尝试从更具体的角度回答这个问题

我们先来看看睡眠是如何进行的:

睡眠是通过将

current
task_struct
从运行队列移动到睡眠队列并调用调度程序运行下一个任务来实现的。例如,
struct mutex
包含一个睡眠队列。睡眠任务不会运行,直到其他人唤醒/将任务移回运行队列,例如使用 mutex_unlock()。

问题如下:

  1. 在硬或软 IRQ 中运行时,
    current
    任务被劫持。它不属于 IRQ 并且可能与之没有任何关系。现在进入睡眠状态意味着该受害者任务将不会运行,直到 IRQ 被解除为止。 完成了。
  2. 正如其他人提到的,如果禁用了中断,则硬件无法再次定期调用调度程序。我不确定接下来会发生什么。也许每个后续任务都必须在下一个任务(如果它完成了)之前运行完成。
© www.soinside.com 2019 - 2024. All rights reserved.