为什么禁用一个本地中断或抢占会导致拥有4个CPU的整个系统无响应?

3
我进行了一些实验,发现当我关闭内核模块中的本地中断时,系统会立即挂起,甚至无法响应键盘中断。(该系统有4个CPU,操作系统为ubuntu 11.10) 关闭本地中断应该只会禁用一个CPU(我猜),但我仍然有3个空闲的CPU。(感到困惑)
与禁用本地中断类似,当我在内核模块中禁用抢占(preempt_disable)时,系统也不再响应。当我在一个内核模块中更改代码时,使用具有编码的代码。
for(;;) 
{
    preempt_disable(); 
    /* ---did some thing fast here--- */ 
    preempt_enable()
}

系统起初对我有响应,但是当我打开另一个控制台或随后进行其他操作时,系统完全挂起。
1个回答

6

可能内核想在所有CPU上执行某个操作,比如RCU同步、缓存相关的同步或其他操作。那么你就会遇到麻烦。

SMP并不是让你肆意独占一个处理器的许可证。

这种情况可以得到解决。我的意思是,你可以有一个CPU,在内核看来它是离线的,但你可以用它来运行任何你想要的东西。


除了加拿大之外,是否有人不知道“hosed”的含义? - Kaz
嗨Kaz,谢谢你的回复。我不太理解所有CPU操作的详细机制。正如你所解释的,如果发生了一些需要在所有CPU之间同步的操作,并且不幸的是,在同一时间,一个CPU中断被禁用,整个系统会停止/挂起吗?我仍然对此感到困惑,因为这将是一个可能发生的事件,SMP应该已经处理过了,至少CPU应该抛出一个关于该场景的异常。 - Roger
1
如果某些处理器禁用了中断,那么“在每个处理器上调用函数(*f)()”操作将无法工作,因为它需要中断。 - Kaz
我知道你的意思,但是如果一个CPU的中断被禁用了,调用“在每个处理器上调用函数(*f) ()”操作的例程或操作本身应该注意到这一点并采取相应措施,即等待中断再次启用或者如果操作是关键的,则只需抛出致命异常,至少不能让整个系统挂起。 - Roger
@Roger:它等待直到所有处理器上的操作完成 - 这意味着它等待直到有关处理器上启用中断。如果中断永远不被启用,它将永远等待。这不是一个错误,因为中断不应该长时间被禁用。 - caf
@caf:谢谢。我明白了关于禁用中断参数的问题。你能给我一个场景,解释为什么禁用抢占也会导致这种失败吗? - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接