Linux中中断是如何排队的?

Linux中中断是如何排队的?

在硬件和软件中断流中如何处理队列?更准确地说我有以下疑问

让我们假设一个场景,我有一台有 2 个 CPU 的机器。 CPU1处理进程P1,CPU2处理进程P2。进程P3正在等待执行。现在CPU1获得了硬件中断(I1)。因此,CPU1 上下文切换到 I1 的中断服务程序 (ISR)。

注意:我们可以忽略中断的下半部分,并认为所有中断只有上半部分。

  • I1 的中断处理完成后。是保证再次安排P1还是有机会安排P3?
  • 如果CPU2空闲,进程P1(因硬件中断而从CPU1中移除)是否会占用CPU2?
  • 如果I1的中断处理程序没有屏蔽任何中断,第二个中断I2会发生什么?如果它会排队谁会记得那个队列?
  • 如果I1的中断处理程序屏蔽了所有中断,第二个中断I2会发生什么情况?

答案1

通常,中断处理程序被设计得尽可能短,并且实际的处理代码在类似进程的上下文中调用。处理程序只是确定源,在软件中添加一个队列条目,然后禁用中断源。当CPU从中断处理返回时,首先处理中断处理程序队列,然后恢复“当前”的任何进程。

在队列评估期间调用的处理程序可以更改哪个进程是“当前”,最明显的例子是指示时间片已到的计时器中断,但传入事件也可以使更高优先级的进程可运行,这将调度它们。

多处理器系统具有显式中断路由,通常具有仅路由到其关联 CPU 的专用定时器 IRQ,并且硬件中断具有“首选”CPU(用于改进缓存局部性)或应用于它们的负载平衡方法,其中中断控制器确保分配它们。

从硬件的角度来看,中断总是被标记,而不是排队,因此中断在被处理之前不能再次发送(因此不存在如果速率太高就会丢失中断的硬件限制),但是操作系统通常会保留一个队列在软件中,因此它在“真正的”IRQ 处理程序中花费尽可能少的时间(并且该队列的长度是有限的,因为每个源只能排队一个实例)。

因此,与一个特定硬件接口的“下半部”处理程序可以被另一个传入中断中断,但所做的只是将第二个中断添加到队列中。然后恢复第一个中断的下半部处理程序,当它返回时,调用第二个中断的下半部处理程序,一旦下半部处理程序队列变空,当前的用户空间进程就会被调用。被执行。

答案2

保证接下来的进程运行。每次处理中断时,内核都会确定接下来要调度的内容(优先级较高的进程变得可运行,当前进程的优先级下降,而另一个进程的优先级上升,...)。无论如何,缓存的内容都会被删除,因此始终恢复正在运行的进程没有多大意义。所发生的事情严格来说是内部内核问题,所使用的策略可以在没有警告的情况下改变。

相关内容