在中断服务程序中,什么都不能用?

时间:2012-02-25 08:16:39

标签: operating-system linux-kernel interrupt

我知道ISR需要非常快,并且应该很快处理中断。但我不明白同样的原因。为什么要满足这个条件?而且,为了做到这一点,对ISR代码的所有内容有什么限制吗?通常情况下,ISR的代码中不应包含所有内容吗?

由于

2 个答案:

答案 0 :(得分:5)

当ISR执行时,没有线程可以在同一个CPU上执行,因此线程调度受到影响,执行的时间越长,影响就越大。根据实现(软件和硬件),可以在ISR执行时禁用所有中断(或较低优先级中断),这意味着如果ISR需要很长时间才能完成,其他中断可能无法足够快地处理,这意味着将是延迟甚至错过中断。

还有一些其他因素需要考虑:

  1. 在ISR中使用锁
  2. 触摸ISR中的分页内存
  3. 如果你在ISR中获得了一个可以锁定的锁,那么如果没有其他ISR或CPU可以释放该锁,你可以进入无限循环。

    如果触摸已交换到磁盘的内存页面,则可能会遇到类似的情况,因为页面错误处理程序可能无法将该页面从磁盘带入内存(如果它在线程中执行此操作)该线程无法执行,因为与ISR相比优先级较低且从未调度过。

答案 1 :(得分:2)

  

我知道ISR需要非常快,应该处理一个   中断很快。但我不明白的原因   相同

最严格的要求是ISR无法阻止 - 它无法入睡。所以你不能使用信号量作为例子。

每个中断都与硬件有关。想想网络设备。它有一个非常小的内存,但它高速接收帧。你最好快速将其中的东西复制到主存储器中,否则帧会压倒设备,它会溢出帧。