在Linux内核中同时发生两个中断时会发生什么??
如果该处理器有多个CPU,则中断可以同时在不同的cpu内核上运行。
答案 0 :(得分:8)
始终存在中断信号的层次结构。最高优先级是CPU首先看到并采取行动。完成后,处理当时的下一个最高优先级中断。由此可能会出现优先级高于前两个的第三个中断信号,因此它将被无序处理,这是优先级的点。
Linux支持interrupt affinity,因此一个IRQ始终路由到特定的CPU或CPU组。点击/proc/interrupts
。
答案 1 :(得分:6)
当处理器响应中断时,中断处理的某些敏感阶段受到另一个中断的中断保护。但是,一般情况下,中断处理程序的大部分执行本身是可中断的,这意味着可以暂停执行处理程序以获取另一个中断,其处理程序必须在原始处理程序可以运行之前运行完成(返回)重启:中断嵌套。
通常有一个优先级方案:某些中断可以中断某些其他中断的处理程序,而其他中断则被阻止。 (从历史上看,有许多方案:从固定数字优先级到完全灵活的掩码。)通常,在执行自己的处理程序时阻塞相同的中断是有意义的。但这在某些情况下不起作用(例如在多个设备之间共享物理中断线或中断号)。
当两个中断请求同时被引发,并且两个中断请求都被取消屏蔽时,给定的处理器只能响应其中一个。从历史上看,这由一些硬件(可能称为“中断控制器”)处理,该硬件多路复用中断线并基于某种优先级方案(可能是可编程的,或者是固定的)来决定哪个中断通过。无法同时处理两个中断:至少服务中断操作的一些关键部分必须序列化:CPU确认中断并调度处理程序时的部分。在某些时候,CPU可以准备好处理仍处于待处理状态的其他中断。
在某些实时操作系统中,中断被分配给实时线程。当收到中断时,内核调度与该中断对应的线程;然后线程为它服务。一旦调度线程,系统就会准备好下一个中断,这将调度另一个线程,依此类推。线程按优先级排序,因此如果优先级较高的中断调度优先级较高的线程,它将抢占较低优先级的中断优先级较低的线程。在这种系统中,如果只有一个处理器,中断仍然没有被同时处理:它只是抢占式多任务处理。
对于多个处理器或内核,可以在不同的内核上独立执行中断服务程序。某些中断只能在特定内核上执行,因为它们与内核有关:例如,一个中断告诉处理器它有来自另一个处理器的重要消息,或者本地完全生成的内容,例如本地可编程中断定时器。与特定的核心联系在一起。特定于设备的中断可以编程为转到特定的CPU或以某种方式指向任意CPU。这些都是特定于硬件的:细节取决于系统的设计方式。可能存在一个系统,其中所有外部中断都绑定到硬件级别的一个特定处理器,Linux可以支持这样的系统。