在多处理器系统中禁用中断的过程是怎样的?

What's the process of disabling interrupt in multi-processor system?

我有一个教科书声明说在多处理器系统中不建议禁用中断,这会花费太多时间。但是我不明白这一点,谁能告诉我多处理器系统禁用中断的过程?谢谢

在 x86(和其他架构,AFAIK)上,enabling/disabling 中断是基于每个内核的。您不能全局禁用所有内核上的中断。

软件可以通过处理器间中断 (IPI) 或原子共享变量在内核之间进行通信,但即便如此,安排所有内核坐在自旋循环中等待来自该内核的通知也会非常昂贵他们可以重新启用中断。 (中断在其他内核上被禁用,因此您无法向它们发送 IPI 以让它们知道您何时完成了原子操作块。)您必须中断所有其他 7 个内核(例如在 8 路 SMP 上系统)正在做,有许多循环的往返通信开销。

这基本上是荒谬的。只说你不能全局禁用所有内核的中断会更清楚,而且它对中断处理程序以外的任何事情都无济于事。理论上是可能,但不只是"slow",这是不切实际的。


如果其他线程在其他内核上运行,则在一个内核上禁用中断不会使某些东西成为原子。禁用中断适用于单处理器机器,因为它使上下文切换变得不可能。 (或者它使得同一个中断处理程序不可能中断自己。)

But I think my confusion is that for me the difference between 1 core and 8 core is not a big number for me; why disabling all of them from interrupt is time consuming.

除了单处理器之外的任何东西都是根本的质的区别,而不是量的。即使是双核系统,如早期的多插槽 x86 和第一个双核单插槽 x86 系统,也会完全改变您的原子性方法。您需要实际锁定或其他东西,而不仅仅是禁用中断。 (例如,早期 Linux 有很多东西都依赖的 "big kernel lock",然后才对相互不冲突的单独事物进行细粒度锁定。)

根本区别在于,在 UP 系统上,只有当前 CPU 上的中断才能导致事情与当前代码正在执行的操作异步发生。 (或来自设备的 DMA...)

在 SMP 系统上,其他内核可以同时做自己的事情


对于多线程,通过在当前 CPU 上禁用中断来获得指令块的原子性是完全无效的;线程可能 运行 在其他 CPU 上。

对于中断处理程序中某些事物的原子性,如果此 IRQ 设置为仅中断此内核,则禁用此内核上的中断 起作用。因为没有其他核心的干扰威胁。