首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SMP系统中的中断处理

SMP系统中的中断处理
EN

Stack Overflow用户
提问于 2009-10-05 22:14:26
回答 2查看 2.3K关注 0票数 3

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

以下是我想提出的问题:

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

保护共享区域的自旋锁具有与设备中断的DIRQL相等的IRQL。只要关键部分例程持有自旋锁并访问DIRQL上的共享区域,ISR就不能在单处理器或SMP机器中运行。

这在单处理器机器上是有意义的,因为中断将不会由CPU服务,直到锁被释放,因为CPU的IRQL不小于中断IRQL。然而,在SMP机器上,如何阻止其他CPU (而不是拥有锁的CPU )处理中断并损坏数据.?

EN

回答 2

Stack Overflow用户

发布于 2009-10-05 22:26:01

读下一节..。

在SMP机器中,

无法获得保护共享数据的自旋锁,而关键部分例程持有自旋锁并在DIRQL上访问共享数据。

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

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

票数 2
EN

Stack Overflow用户

发布于 2009-10-05 22:20:50

我的理解是,当系统将DIRQL提升到一定的级别时,所有处理器上所有处于DIRQL或更低级别的中断都会被有效地禁用。这就是为什么你不应该提高IRQL的时间超过它绝对需要保持的时间。

很少有驱动程序代码需要将IRQL提升到高于调度级别(这不会掩盖任何中断)。唯一需要提高IRQL更高的驱动程序代码是实际需要与中断处理程序交互(共享数据)的代码。

编辑:ChrisW对SMP系统中正在发生的事情有更好的描述--提高处理器上的IRQL将防止IRQ在特定处理器上被处理。如果interrtupt处理程序计划在另一个CPU上,而保护共享数据的自旋锁由第一个CPU持有,则中断处理程序将在其CPU上旋转,直到第一个CPU释放自旋锁为止(为了永久访问共享数据,中断处理程序必须建立自旋锁,这就是迫使中断处理程序等待的原因)。

因此,保持这些自旋锁尽可能短(并且尽可能少)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1522690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档