对于这个问题,本人也做了一些思考,也看了很多网上的讨论,目前也没有确定的结果。现把思路总结一下,以后有新的理解时随时更新。
1. 睡眠导致蓝屏?
阅读wrk代码可以知道,蓝屏其实是系统在判断irql后主动进入的结果,这是一种系统设计,是规则而不是原因。
2. 中断没有上下文?
其实中断是有上下文的,就是被中断线程的上下文,中断其实是借用了该线程的内核堆栈。我们可以理解为线程调用了ISR,虽然这不是线程主动的结果。
3. 堆栈溢出?
理由不成立,就算没有睡眠,中断嵌套也是存在的。
4. 中断因为睡眠切换出去不知道怎么切换回来。
如前所述,中断是借用被中断线程的内核堆栈,完全可以把现场信息保存在线程控制块中,睡眠过了后重新调度这个线程运行时继续执行之前未完成的ISR。
5. 把ISR切换出去会带来很多问题,引入设计的复杂性,影响系统的实时性和稳定性。
系统设计完全可以把系统设计成ISR允许睡眠(时钟中断除外),但这会带来以下问题:
(1)被中断线程和低优先级中断的公平性问题。线程和低优先级中断被打断可以认为是为了更紧急事件而把cpu让出来,现在这个更紧急事件的处理却睡眠,更紧急事件和睡眠本身就是一种矛盾。睡眠导致被打断线程因为和自己不相干的原因而等待,这对调度算法来说是一种破坏。另外,中断因为睡眠导致所有低优先级的中断得不到响应,这不是好的设计。无论什么原因,中断被线程抢占也是不合理的,破坏了系统的优先级设定。
(2)睡眠的根本原因在于等待某种条件的成立,这种条件往往是低优先级执行路径来满足,而低优先级执行路径有可能会被睡眠而阻塞,这就导致了死锁问题。