operating-system - SMP 系统上的中断处理

标签 operating-system interrupt-handling interrupt

中断是否分配给固定的 CPU(总是由同一个 CPU 处理)?

将我的问题放在上下文中:

来自: http://msdn.microsoft.com/en-us/library/ms795060.aspx

保护共享区域的自旋锁的 IRQL 等于设备中断时的 DIRQL。只要临界区例程持有自旋锁并访问 DIRQL 的共享区域,ISR 就不能在单处理器或 SMP 机器上运行。

这在单处理器机器上是有意义的,因为 CPU 的 IRQL 不小于中断 IRQL,直到锁被释放,中断才会被 CPU 服务。然而,在 SMP 机器上,什么会阻止中断被另一个 CPU(不是拥有锁的 CPU)处理并破坏数据...?

最佳答案

阅读下一节......

In an SMP machine, the ISR cannot acquire the spin lock that protects the shared data while the critical-section routine holds the spin lock and accesses the shared data at DIRQL.

...我认为这是在说在 SMP 机器上中断可以发生;但是如果中断发生,那么中断服务例程(在另一个 CPU 上运行)仍然无法获取自旋锁:即它自旋,浪费周期,尝试获取自旋锁,除非你释放自旋锁让等待的 ISR 获取它。

我想知道为什么它可能允许 ISR 在另一个 CPU 上运行,而不是像在单 CPU 情况下那样屏蔽中断(以防止 ISR 被启动)。对此的答案是,无论在持有自旋锁时是否可以在另一个 CPU 上启动新的 ISR,事实是(与单 CPU 情况不同)一个 ISR 可能已经 在 DIRQL 自旋锁启动时在另一个 CPU 上运行:正是出于这个原因,这样的 ISR(如果它存在于另一个 CPU 上)必须自旋(如果它试图获取自旋锁)。

关于operating-system - SMP 系统上的中断处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522690/

相关文章:

c - 设备驱动程序和轮询中的中断处理

interrupt - 68k 组件 : Does the CPU does store the status register on interrupt?

javascript - 中断原型(prototype)函数传播

Java - 仅在多处理器系统中使用 volatile 才有意义?

c - 在c中使用lseek命令获取文件大小

linux - 中断上下文下半部分(Softirq 或 tasklet)

kernel - 在 x86 上,当操作系统禁用中断时,它们会消失,还是会排队并 'wait' 以便中断重新启动?

python - 关闭用 os.fdopen 打开的文件会关闭 os 级 fd 吗?

multithreading - 用户级线程的好处

linux - 内核栈和用户空间栈