windows在ISR中不能睡眠的原因

    对于这个问题,本人也做了一些思考,也看了很多网上的讨论,目前也没有确定的结果。现把思路总结一下,以后有新的理解时随时更新。

1.  睡眠导致蓝屏?

    阅读wrk代码可以知道,蓝屏其实是系统在判断irql后主动进入的结果,这是一种系统设计,是规则而不是原因。

2. 中断没有上下文?

    其实中断是有上下文的,就是被中断线程的上下文,中断其实是借用了该线程的内核堆栈。我们可以理解为线程调用了ISR,虽然这不是线程主动的结果。

3. 堆栈溢出?

    理由不成立,就算没有睡眠,中断嵌套也是存在的。

4. 中断因为睡眠切换出去不知道怎么切换回来。

    如前所述,中断是借用被中断线程的内核堆栈,完全可以把现场信息保存在线程控制块中,睡眠过了后重新调度这个线程运行时继续执行之前未完成的ISR。

5. 把ISR切换出去会带来很多问题,引入设计的复杂性,影响系统的实时性和稳定性。

    系统设计完全可以把系统设计成ISR允许睡眠(时钟中断除外),但这会带来以下问题:

     (1)被中断线程和低优先级中断的公平性问题。线程和低优先级中断被打断可以认为是为了更紧急事件而把cpu让出来,现在这个更紧急事件的处理却睡眠,更紧急事件和睡眠本身就是一种矛盾。睡眠导致被打断线程因为和自己不相干的原因而等待,这对调度算法来说是一种破坏。另外,中断因为睡眠导致所有低优先级的中断得不到响应,这不是好的设计。无论什么原因,中断被线程抢占也是不合理的,破坏了系统的优先级设定。

   (2)睡眠的根本原因在于等待某种条件的成立,这种条件往往是低优先级执行路径来满足,而低优先级执行路径有可能会被睡眠而阻塞,这就导致了死锁问题。

    

你可能感兴趣的:(windows开发)