Chinaunix

标题: 在定时器handler内可睡眠吗(解决) [打印本页]

作者: studyboy_3w    时间: 2009-06-15 15:57
标题: 在定时器handler内可睡眠吗(解决)
内核在时钟中断发生后执行定时器, 定时器作为软中断在下半部上下文执行。《From LKD》

因为软中断在下半部上下文执行是不可以阻塞 睡眠的, 在定时器handler内是不可睡眠, 对吗?

[ 本帖最后由 studyboy_3w 于 2009-6-18 13:11 编辑 ]
作者: emmoblin    时间: 2009-06-15 22:55
我也不太明白,讨论一下:
为什么不可以阻塞呢?如果在软终端中读取硬件可能时间很长,就需要阻塞。
软中断这部分一直没仔细想过,明天我得研究研究
作者: studyboy_3w    时间: 2009-06-17 18:27
还是不清楚阿??
作者: studyboy_3w    时间: 2009-06-17 18:28
睡觉,等答案..............
作者: wxc200    时间: 2009-06-17 23:10
原帖由 studyboy_3w 于 2009-6-15 15:57 发表
内核在时钟中断发生后执行定时器, 定时器作为软中断在下半部上下文执行。《From LKD》

因为软中断在下半部上下文执行是不可以阻塞 睡眠的, 在定时器handler内是不可睡眠, 对吗?


在handler里面已經把spin lock釋放,中斷打開了,所以這個時候block也沒有關系呀

樓主可以看下kernel/timer.c里面__run_timers這個函數。

個人之見,呵呵
作者: junonly    时间: 2009-06-17 23:54
我的也、理解是
软中断不能阻塞,不能睡眠。软中断有一个入口是在irq_exit(),也就是上半部完成后的一个检查,如果软中断可以阻塞,那么这个中断没有返回,被调度出去就麻烦了。而在ksoftirq入口的应该是可以阻塞的,设计ksoftirq就是为了让软中断能真正的延后,不要老在上半部完成后执行
作者: flyinox    时间: 2009-06-18 10:36
软中断是不能睡眠的,睡眠会导致进程调度。又由于local_bh_disable();那么BH部分实际是被锁住了,那么在其他进程里面都不能执行软中断,直到本进程被调用。
你想想你的中断处理程序真的需要睡眠么,如果需要,用工作队列来做,这个是可以睡眠的。
作者: studyboy_3w    时间: 2009-06-18 11:04
我知道软中断是不能睡眠的,睡眠会导致进程调度。
问题是在内核定时器handler中能否睡眠?
作者: flyinox    时间: 2009-06-18 11:11
那你说内核定时器handler是什么?
作者: qiwei9743    时间: 2009-06-18 11:27
不能睡眠,楼上解释非常清楚了。
作者: flyinox    时间: 2009-06-18 11:37
LZ请换个思维再想想。定时器是可以保证系统中进程的睡眠情况的,请问如果定时器都睡眠了。。。呵呵
就像你家闹钟是叫你起床的,如果你的闹钟睡觉了,谁来叫你的闹钟起床?
作者: studyboy_3w    时间: 2009-06-18 13:11
Great.  Thanks all you guys.

结论是:
timer handler是不可以睡眠的。
作者: wxc200    时间: 2009-06-18 13:56
原帖由 wxc200 于 2009-6-17 23:10 发表


在handler里面已經把spin lock釋放,中斷打開了,所以這個時候block也沒有關系呀

樓主可以看下kernel/timer.c里面__run_timers這個函數。

個人之見,呵呵


我在这个地方说错了。 大家的观点是正确的。呵呵   
作者: nyquist892004    时间: 2009-06-18 17:11
agree, if your code sleep in softirq context, once schedule() function is called, a lot of trash will be printed out.......please see schedule() for detail.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2