linux 2.6内核可抢占的迷惑
现有一个内核的项目,包含了一个自定义的内核中使用的消息队列函数库,在接收消息的时候函数内部使用wait_event_interruptable 来实现。在模块代码中新建了一个线程,线程中使用了两个这样的消息队列来监听两类数据,线程主体是一个while循环。现在的问题是,当两个消息队列内部的wait_event的超时定为0时,装载模块后机器会宕机,在两个接收消息体的语句中间手工加一个空的wait_queue,然后在其上等待10个jiffies以上(也是interruptable,此时该线程应该能进入休眠)时,该线程可被正常的停止和杀掉。
针对这个问题有些疑问
1、Linux 2.6内核是可抢占的,那为什么当wait_event_interruptable的超时为0时机器会宕掉,是因为内核模块的优先级和该线程的一样高,还是说内核线程必须手动调用schedule,或者包含显式让线程休眠的代码才能让其他的内核线程stop该线程呢。
2、当使用wait_event或者其他互斥原语,不带interruptable时,是说该线程不接受中断,还是说只要该线程一直在运行就会屏蔽整个系统的中断从而导致不能运行其他内核线程呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
1. 不清楚你的意思。
2、当使用wait_event或者其他互斥原语,不带interruptable时,是说该线程不接受中断,还是说只要该线程一直在运行就会屏蔽整个系统的中断从而导致不能运行其他内核线程呢?
》》不带interruptable时 并非HW不可用中断。A线程 wait event_** 进入阻塞模式, B线程 wake_up 或者 HW中断 wake_up, A 不就起来了嘛。
1、我自己测试了一下,在一个内核线程里使用while循环,则加载模块后系统宕机,这样应该是表示该线程没有让出CPU吧,但是Linux2.6是可抢占的,应该在时钟中断来到后发起抢占(在理解linux内核中有描述)啊?
2、不使用interruptable的wait_event还能让出CPU给别的线程或者系统还会执行HW中断么?在LDD中说的可是对每个CPU该函数不会主动让出CPU的。
1. 加载模块后系统宕机? 是什么现象? 终端不能动? 若是, 是否你在module_init function 用了while? 那么终端死掉。其他线程应该可用跑的。
2.在LDD中说的可是对每个CPU该函数不会主动让出CPU的。 到了里面的code就是主动了。 呵呵
多谢!!
2.在LDD中说的可是对每个CPU该函数不会主动让出CPU的。 到了里面的code就是主动了
这句话是什么意思
wait_even 的实现代码会让出CPU 调用schudle()
这个我知道,当时的问题出现在自定义的库里面,timeout为0则直接退出,不会调用wait_event函数