2011-05-05 144 views
6

在Linux下,禁用特定CPU内核上的所有中断,甚至包含多个芯片的系统中的单个芯片上的所有内核的缺点是什么(如果有)?在编写一个对延迟极其敏感的C程序时,我的迫切愿望是将自己的核心线程分离出来,并将所有其他任务移至独立的核心,我想知道什么是权衡。cpu屏蔽和禁用内核中断

+0

我想在你的程序中,你不希望任何来自periferies的输入或抛出异常的权利? – Pyjong 2011-05-05 19:15:08

回答

3

主线Linux内核的设计目的不是为了在一段时间内在CPU上禁用所有IRQ。有很多需要这种IRQ的内核函数--RRC就是其中之一。一个RCU暂停可以并且将会使系统的其余部分停止,并且避免这种暂停可能(取决于正在使用的RCU实现)涉及广播给所有CPU的IPI(处理器间中断)。

也就是说,有正确实现这种CPU隔离的实验性补丁;例如:http://lwn.net/Articles/268711/ - 在禁用中断路由之前,它们会经历使CPU脱机(从内核其余部分的角度来看)所需的所有内部回转。虽然这是一个相当老的补丁系列,您可能需要联系修补程序系列的开发人员,以查看他们是否在某个地方拥有较新的版本,或者将这些修补程序修改为当前版本的内核。 PREEMPT_RT人们也在考虑实施它 - 请参阅https://rt.wiki.kernel.org/index.php/Main_Page(尽管它尚未实施)。祝你好运!

+0

感谢您的参考! – 2011-05-10 16:00:03

2

几件事情要考虑:

  1. 任何的IRQ将少了一个处理器上运行,这意味着你更可能有中断等待。显然这随着处理器数量的增长而变小。
  2. 没有中断,强制流程放弃执行将会困难得多。如果它决定进入无限循环,则不能中断处理器来停止它。

如果您完全相信进程将在合理的时间内放弃控制并且不担心中断排队,那么禁用中断可能会有所帮助。

+0

我没有想过过程获得处理器控制权的可能性,并且由于错误而不放弃它,非常感谢您指出了这一点! – 2011-05-10 15:59:35

+1

如果确实如此,当活动线程尝试访问无效地址并发生页面错误时会发生什么?它怎么会停不下来? – Syncopated 2012-12-16 18:42:49

+1

@Syncopated没有办法确保会发生。如果它运行'while(1){}'会怎么样?这可以编码为单个指令并且不进行数据访问,因此它一旦启动就不会导致页面错误。 – ughoavgfhw 2012-12-16 19:40:12