我是一名Linux设备驱动程序新手,想要知道tasklet
和workqueue
之间的确切区别。我有以下疑问:
- 在运行中断/进程上下文时,中断、tasklet和workqueue使用哪个内核堆栈?
- tasklet和workqueue以什么优先级运行,我们可以修改它们的优先级吗?
- 如果我实现自己的工作队列列表,我是否可以独立地安排/优先处理它?
我是一名Linux设备驱动程序新手,想要知道tasklet
和workqueue
之间的确切区别。我有以下疑问:
- 在运行中断/进程上下文时,中断、tasklet和workqueue使用哪个内核堆栈?
- tasklet和workqueue以什么优先级运行,我们可以修改它们的优先级吗?
- 如果我实现自己的工作队列列表,我是否可以独立地安排/优先处理它?
Tasklets:
Work queues:
总体来说:对于必须在硬中断上下文之外执行的高优先级、低延迟的原子任务,请使用tasklets。
您可以使用tasklet_hi_enable
/tasklet_hi_schedule
(而不是它们各自的无_hi
版本)控制一定程度的优先级。来自这个IBM页面的说明如下:
正常优先级的调度通过TASKLET_SOFTIRQ级别的softirq执行,高优先级通过HI_SOFTIRQ级别的softirq执行。
...
来自高优先级向量的tasklets首先得到服务,然后是正常向量上的tasklets。请注意,每个CPU都维护自己的正常和高优先级softirq向量。
对于工作队列,在创建时,您将使用alloc_workqueue
(create_workqueue
已弃用),并可以传递一个标志以请求更高的优先级:
其他模块维护着各自独立的工作池,并在其工作人员中实现并发管理。WQ_HIGHPRI:
高优先级wq的工作项被排入目标gcwq的高优先级线程池中。高优先级线程池由具有提高的nice级别的工作线程服务。
请注意,正常和高优先级线程池不会相互交互。