为什么中断处理程序(ISR)无法入睡?

我很困惑,为什么中断处理程序无法入睡? 我对同一个问题有2次意见: –

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

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

中断处理程序是否可以安排,
但同时优先级较低的系统时钟中断
被这些优先级较高的中断屏蔽
他们不能安排?

请给我一个很好的例子。

当中断发生时,处理器进入exception状态(中断上下文)。 发生这种情况时,调度程序将被禁用,直到处理器退出此状态。 如果您将任务置于hibernate状态,则任务进入等待队列并告诉调度程序将其他任务出列。 如果它发生在中断上下文中,则在我们完成此上下文并且处理器挂起之前没有调度程序,因为我们从未完成中断。 究竟发生了什么是处理器所依赖的。 一个解决方案是在线程中运行实际的中断代码 – 这称为线程中断,这是实时补丁中的一个配置,使linux“难以实时”

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

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

来自Quora的Robert Love