我是Linux设备驱动程序的新手,想知道tasklet
和workqueue
之间的确切差异。此外,我也有疑虑:
- 在中断/进程上下文中运行时,哪个内核堆栈会执行中断,tasklet和workqueue?
- tasklet和workqueue的优先级是什么,我们可以修改它的优先级吗?
- 如果我实现自己的工作队列列表,我可以单独安排/优先处理吗?
醇>
答案 0 :(得分:13)
<强>微进程强>:
工作队列:
底线是:将tasklet用于高优先级,低延迟的原子任务,这些任务必须仍然在硬IRQ上下文之外执行。
您可以使用tasklet_hi_enable
/ tasklet_hi_schedule
(而不是各自的no - _hi
版本)来控制使用tasklet的某种级别的优先级。来自this IBM page:
正常优先级调度通过TASKLET_SOFTIRQ级别softirq执行,其中高优先级通过HI_SOFTIRQ级别softirq。
...
首先处理来自高优先级向量的Tasklet,然后是法向量上的那些。请注意,每个CPU都保持自己的普通和高优先级softirq向量。
使用工作队列,在创建工作队列时,您将使用alloc_workqueue
(create_workqueue
已弃用)和can pass a flag要求更高的优先级:
WQ_HIGHPRI:
highpri wq的工作项排队到highpri线程池 目标gcwq。 Highpri线程池由工作线程提供 提高水平。
请注意,普通线程池和highpri线程池不会与每个线程池进行交互 其他。每个人都保持独立的工人和工具库 其工人之间的并发管理。
我无法回答你的所有问题,但我希望无论如何都会有所帮助。