各位大神,你们好。我在使用workqueue的过程中遇到一个问题。
项目采用uClinux系统,VoIP相关的。
现有两个驱动,一个是负责数据传输的,还有一个是负责打电话的。这两个驱动里分别使用了一个workqueue。在数据传输量很大时,负责数据传输的workqueue非常耗费资源,CPU占用能达到60-70%。这时候,我打电话,也就是让负责打电话的workqueue工作,但是此时打电话的workqueue执行会出现延时(这个打电话的workqueue对时间很敏感),打电话就不正常了。没有数据传输或者数据量很小时,一切正常。
我尝试着将打电话的代码全部放到中断程序里做(这样任何人都不能打断他,除非更高级别的中断),然而打电话调用的API会出现睡眠的情况,内核会崩溃(中断程序中不能睡眠)。
我现在想知道workqueue有没有优先级的概念?有的话我可以把打电话的workqueue优先级设置为高。这样不管数据传输那边有多忙,电话总是能抢到CPU啊!
我查了网上的资料,workqueue其实就是一个内核线程,既然是线程,应该有优先级的概念啊。由于我没有内核编程的经验,还请有经验的大侠给予指导!
小弟先谢谢了!
------解决方案--------------------
能否用其他办法来实现?工作队列本来就不是很适时的。
------解决方案--------------------
通常做法,就是合理划分任务模块,将时间敏感部分放到中断里,其他执行或有可能休眠的放到线程等部分。。。
------解决方案--------------------
理解有点误差,在单处理器的系统上,所有workqueue都由一个内核线程维护。
建议打电话的驱动就不要使用workqueue机制了。
数据传输和打电话应该使用两个进程,打电话的进程也不会一直占用CPU,收发语音信息时才会触发中断,每一句话结束时恢复中断,每句话之间的间隔看似很短,但对CPU来说已经是很长的时间了。