我有一条教科书声明说,不建议在多处理器系统中禁用中断,这会花费太多时间。但是我不明白这一点,谁能告诉我多处理器系统禁用中断的过程吗?谢谢
答案 0 :(得分:3)
启用/禁用中断是基于每个内核的。您不能全局禁用所有内核上的中断。
软件可以使用处理器间中断(IPI)或原子共享变量在内核之间进行通信,但是即使如此,安排所有内核进入自旋循环中以等待该内核发出的通知也将是非常昂贵的可以重新启用中断。 (在其他内核上禁用了中断,因此您无法在完成原子操作块时向它们发送IPI来告知他们。)您必须中断所有其他7个内核(例如,在8路SMP上)系统),并且往返通信开销的周期很多。
这基本上是荒谬的。仅仅说您不能全局禁用所有内核的中断会更清楚,并且除了中断处理程序外,它对其他任何事情都无济于事。从理论上讲,这是可能的,但是不只是“慢”,这是不切实际的。
如果其他线程正在其他内核上运行,则禁用一个内核上的中断不会使某些事情变得原子。禁用中断在单处理器计算机上有效,因为它使上下文切换变得不可能。 (或者使同一中断处理程序无法中断自身。)
但是我认为我的困惑是,对我来说1核和8核之间的差对我来说不是很大;为什么要全部禁用中断会很费时间。
除单处理程序外,其他都是基本的质量差异,而不是定量的差异。即使是双核系统,例如早期的多插槽x86和第一个双核一插槽x86系统,也会完全改变您的原子性方法。您实际上需要采取锁定措施或其他措施,而不仅仅是禁用中断。 (例如,早期的Linux具有“大内核锁”,很多东西都依赖于此,而在对彼此不冲突的单独事物进行细粒度的锁定之前。)
根本的区别在于,在UP系统上,只有当前CPU上的中断才可以使事情与当前代码的工作异步发生。 (或者来自设备的DMA ...)
在SMP系统上,其他内核可以同时在做自己的事情。
对于多线程,通过禁用当前CPU上的中断来获取指令块的原子性是完全无效的;线程可能正在其他CPU上运行。
对于中断处理程序中某些事物的原子性,如果将此IRQ设置为仅中断此内核,则在该内核上禁用中断将起作用。因为不存在来自其他内核的干扰的威胁。