我正在阅读罗伯特·洛夫(Robert Love)撰写的以下文章
http://www.linuxjournal.com/article/6916 http://www.linuxjournal.com/article/6916
说的是
“...让我们讨论一下工作队列在进程上下文中运行的事实。这与其他下半部机制形成对比,这些机制都在中断上下文中运行。在中断上下文中运行的代码无法休眠或阻塞,因为中断上下文没有用于重新调度的后备进程。因此,因为中断处理程序不与进程关联,所以调度程序没有任何东西可以进入睡眠状态,更重要的是,调度程序没有任何东西可以唤醒......”
我不明白。 AFAIK,内核中的调度器是O(1),即通过位图实现的。那么是什么阻止调度程序将中断上下文置于睡眠状态并获取下一个可调度进程并将控制权传递给它呢?
那么是什么阻止调度程序将中断上下文置于睡眠状态并获取下一个可调度进程并将控制权传递给它呢?
问题是中断上下文不是一个进程,因此不能进入睡眠状态。
当中断发生时,处理器将寄存器保存到堆栈上并跳转到中断服务程序的开头。这意味着当中断处理程序运行时,它在中断发生时正在执行的进程的上下文中运行。中断正在该进程的堆栈上执行,当中断处理程序完成时,该进程将恢复执行。
如果您尝试在中断处理程序中休眠或阻塞,那么您不仅会停止中断处理程序,还会停止它中断的进程。这可能很危险,因为中断处理程序无法知道被中断的进程正在做什么,或者即使挂起该进程是否安全。
可能出现问题的一个简单情况是中断处理程序与其中断的进程之间出现死锁。
-
Process1进入内核模式。
-
Process1获得LockA.
- 发生中断。
- ISR 开始执行使用Process1的堆栈。
- ISR 试图获取LockA.
- ISR调用sleep等待LockA即将面世。
此时,你陷入了僵局。Process1在 ISR 完成其堆栈之前,无法恢复执行。但 ISR 被阻塞等待Process1释放LockA.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)