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