关于中断以及进程调度
最近在看内核的文章的时候说“中断不能休眠”是什么意思?
另外在中断程序之后的下半部分中也要的处理中例如采用”软中断“也不能休眠。如果说中断是为了快速处理不能休眠,下半部分的处理不是相对不那么急,为什么不能进行休眠呢?
中断为什么不能调度啊?不是很理解。
另外,我们说对于交互型的进程进行处理的时候,系统有限调度这类任务。很多例子都用键盘的输入来进行举例。但是键盘输入本身是一个中断的事件,是不可以调度的啊。糊涂了。望各位大侠帮忙解答。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
第一个问题,我认为是因为
中断上下文因为切换了栈,用的不是进程的栈。不是一个可调度的调度体(不能通过栈找到所有寄存器的值),所以不能休眠(休眠了不能调度回来)。这是一个老问题,前些日子讨论过了
第二个问题,我认为你的说法很对
http://bbs.chinaunix.net/thread-2306027-1-8.html
恩,谢谢啊。
还有啊,我们说的交互式的任务,例如键盘输入的问题,键盘输入是一个中断,然后通过中断处理把数据送入内存之后,然后交由那个交互式的进程进行处理,那个交互式的进程是可以休眠的。而次之前的中断处理以及后半部分则不可以,是这样吗?
回复 2# amarant
本帖最后由 amarant 于 2011-05-26 13:43 编辑
回复 4# gulang2004xy
恩 键盘的驱动可以在中断里激活一个工作队列然后就返回了,但是貌似工作队列的优先权都是很低的(好像在某本书看过。。不知到是不是这样,有知道的说一下)。这里我也不是很明白
回复 1# gulang2004xy
http://linux.chinaunix.net/bbs/viewthread.php?tid=902033
可以这么理解,调度的基本单位是进程, 中断不属于任意一个进程,那么中断中休眠后,就会引起schedule,既然中断不属于任意一个进程,也不是独立进程,那么就没有权利进入到调度队列中去。所以就回不来了。而workqueue在创建时会制造一个task_struct,是一个调度实体,所以可以休眠
回复 1# gulang2004xy
还是这个答案好:
这是规定,不需要理由,所以也不要去找理由。
貌似Montavista为了改善实时性,在某些情况下是允许调度中断处理程序的。