我是Linux设备驱动新手,想知道taskletworkqueue之间的确切区别。此外,我还有以下疑问:
在中断/进程上下文中运行时,中断、tasklet和工作队列使用哪个内核堆栈?
tasklet和workqueue以什么优先级运行,我们可以修改它的优先级吗?
如果我实现了自己的工作队列列表,我可以独立地安排/优先化它吗?

最佳答案

微线程:
都很老了(我相信大约2.3岁)
有一个简单明了的api
专为低延迟设计
无法休眠(在软irq上下文中原子地运行,并且对于给定的tasklet,保证永远不会在给定处理器的多个cpu上运行)
工作队列:
是较新的(在2.5中引入)
有一个灵活的API(支持更多的选项/标志)
专为更高的延迟而设计
可以睡觉
底线是:对于仍然必须在硬irq上下文之外执行的高优先级、低延迟的原子任务,使用微线程。
您可以使用tasklet_hi_enable/tasklet_hi_schedule(而不是它们各自的no-_hi版本)来控制微线程的某些优先级。从this IBM page
正常的优先级调度通过tasklet_softirq-level softirq执行,其中高优先级通过hi_softirq-level softirq执行。

来自高优先级向量的微线程首先得到服务,然后是来自正常向量的微线程。请注意,每个cpu都维护自己的正常和高优先级软irq向量。
对于工作队列,在创建工作队列时,您将使用alloc_workqueuecreate_workqueue已弃用)和can pass a flag来请求更高的优先级:
高优先级:
highpri wq的工作项排队到highpri线程池
目标GCWQ。highpri线程池由工作线程提供服务
高水平的。
注意,normal和highpri线程池不与每个线程池交互
其他。每个工厂都有各自的工人和工具
工作人员之间的并发管理。
我不能回答你所有的问题,但我希望这能有帮助。

10-07 15:20