是否将中断分配给固定CPU(始终由同一CPU处理)?
将我的问题放在上下文中:
自: http://msdn.microsoft.com/en-us/library/ms795060.aspx
保护共享区域的自旋锁具有等于设备中断的DIRQL的IRQL。只要关键段例程保持自旋锁并在DIRQL上访问共享区域,ISR就无法在单处理器或SMP机器中运行。
这在单处理器机器上是有意义的,因为CPU释放锁之前CPU不会为中断服务,因为CPU的IRQL不小于中断IRQL。但是,在SMP机器上,什么会阻止中断由其他CPU(而不是拥有锁的CPU)处理并破坏数据......?
答案 0 :(得分:2)
阅读下一节......
在SMP机器中,ISR不能 获得保护的旋转锁 同时共享数据 临界区常规保持 旋转锁定并访问共享数据 在DIRQL。
...我想这就是说在SMP机器上会发生中断 ;但是如果中断发生,那么中断服务程序(在另一个CPU上运行)仍然无法获得自旋锁:即它旋转,浪费周期,尝试获取自旋锁,除非你释放自旋锁让等待的ISR获得它。
我想知道为什么它可能允许ISR在另一个CPU上运行,而不是像在单CPU情况下那样屏蔽中断(以防止启动ISR)。答案是,无论在保持自旋锁的情况下是否可以在另一个CPU上启动新的ISR,事实是(与单CPU情况不同),ISR可能已经在启动DIRQL自旋锁时,正在另一个CPU上运行:因此,这样的ISR(如果它存在于另一个CPU上)必须旋转(如果它试图获取自旋锁)。
答案 1 :(得分:0)
我的理解是,当系统将DIRQL提升到某个级别时,在所有处理器上有效禁用该DIRQL或更低级别的任何中断。这就是为什么你不应该提出IRQL的时间超过绝对需要的时间。
很少的驱动程序代码需要将IRQL提升到高于调度级别的级别(不会屏蔽任何中断)。需要提高IRQL的唯一驱动程序代码是实际需要与中断处理程序交互(共享数据)的代码。
编辑:ChrisW更好地描述了SMP系统中发生的事情 - 在处理器上提升IRQL将阻止在该特定处理器上处理IRQ。如果interrtupt处理程序在另一个CPU上进行调度,而保护共享数据的自旋锁由第一个CPU保持,则中断处理程序将在其CPU上旋转,直到第一个CPU释放自旋锁(为了永久访问共享数据,中断处理程序必须获取自旋锁,这是迫使中断处理程序等待的原因。
所以尽可能地保持那些旋转锁(尽可能不频繁)。