Bin*_*eee 3 cpu interrupt cpu-architecture multiprocessing
我有一个教科书声明说在多处理器系统中不建议禁用中断,这会花费太多时间。但我不明白这一点,谁能告诉我多处理器系统禁用中断的过程?谢谢
在 x86(和其他架构,AFAIK)上,启用/禁用中断是基于每个内核的。您不能在所有内核上全局禁用中断。
软件可以通过处理器间中断 (IPI) 或原子共享变量在内核之间进行通信,但即便如此,将所有内核安排在自旋循环中等待来自该内核的通知,即它们可以重新启用中断。(中断在其他内核上被禁用,因此您无法向他们发送 IPI 以让他们知道您何时完成了原子操作块。)您必须中断所有其他 7 个内核(例如在 8 路 SMP 上)系统)正在做,有许多循环的往返通信开销。
这基本上是荒谬的。更清楚的是,您不能全局禁用所有内核的中断,并且对于中断处理程序以外的任何事情都无济于事。 这在理论上是可能的,但不仅“慢”,而且不切实际。
如果其他线程正在其他内核上运行,则禁用一个内核上的中断不会使某些事情成为原子。禁用中断适用于单处理器机器,因为它使上下文切换变得不可能。(或者它使得同一个中断处理程序不可能自己中断。)
但我认为我的困惑是,1 核和 8 核之间的差异对我来说并不是一个大数字;为什么从中断中禁用所有这些是耗时的。
单处理器以外的任何东西都是根本的质的差异,而不是数量的差异。即使是双核系统,如早期的多路 x86 和第一个双核单路 x86 系统,也会彻底改变您的原子性方法。您需要实际使用锁或其他东西,而不仅仅是禁用中断。(例如,早期的 Linux 有一个“大内核锁”,很多东西都依赖于它,在它对不相互冲突的单独事物进行细粒度锁定之前。)
根本区别在于,在 UP 系统上,只有当前 CPU 上的中断才能导致事情与当前代码正在执行的操作异步发生。(或来自设备的 DMA...)
在SMP系统上,其它内核可以做自己的事同时。
对于多线程,通过在当前 CPU 上禁用中断来获得指令块的原子性是完全无效的;线程可以在其他 CPU 上运行。
对于中断处理程序中某些事物的原子性,如果将此 IRQ 设置为仅中断此内核,则禁用此内核上的中断将起作用。因为没有来自其他核心的干扰威胁。