首页 > 解决方案 > 在多处理器系统中禁用中断的过程是什么?

问题描述

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

标签: multiprocessingcpuinterruptcpu-architecture

解决方案


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

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

这基本上是荒谬的。更清楚地说,您不能全局禁用所有内核的中断,而且除了中断处理程序之外,它无论如何都无济于事。 这在理论上是可能的,但它不仅“慢”,而且不切实际。


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

但我认为我的困惑是,对我来说,1 核和 8 核之间的差异对我来说并不是一个大数字。为什么从中断中禁用所有这些是耗时的。

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

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

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


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

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


推荐阅读