multiprocessing - 在多处理器系统中禁用中断的过程是什么?

标签 multiprocessing cpu interrupt cpu-architecture

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

最佳答案

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

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

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

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

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 有一个“大内核锁”,很多东西都依赖于它,在它对不相互冲突的单独事物进行细粒度锁定之前。)

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

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

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

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

关于multiprocessing - 在多处理器系统中禁用中断的过程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53919482/

相关文章:

python - Python 中多处理返回值的快速整形

python - 为什么 Python 处理完成后不加入输入和输出队列?

c# - WPF 的 CPU throttle 问题

java - 用 Java 实现中断服务例程

python - 我们如何使用python生成键盘中断

python - multiprocessing.Pool.imap_unordered 的内存使用量稳步增长

python - 在装饰器中运行多处理

multithreading - 一个CPU进程总是至少有一个线程吗?

linux 中的 java 服务器 cpu 使用监视器

java - java中的中断处理