差异b / w kthread和工作队列

时间:2014-04-15 21:01:07

标签: linux-kernel kernel kernel-module

当他们被创建为以下时,我很困惑b / w workqueues和kthread -

为每个在线CPU创建kthread并绑定到1个唯一的CPU

for_each_online_cpu(cpu) {
    kthread = kthread_create(func, ...);
    kthread_bind(kthread, cpu);
}
//Each kthread will process work in serialized manner 

为每个在线CPU创建BOUND工作队列,其中@max_active为1

for_each_online_cpu() {
    wq = alloc_workqueue(name, WQ_MEM_RECLAIM, 1)
}
// queue_work_on(cpu, work) will ensure the works queued on a particular CPU are 
   processed in a serialized manner.

请告诉我,如果我的理解是正确的,那么kthread相对于工作区有什么好处,反之亦然。

提前致谢。

2 个答案:

答案 0 :(得分:6)

"工作"是一些应该在合理的时间内完成的行动。虽然它可以睡觉,但它不应该长时间这样做,因为多个工作项共享同一个工作线程。

只要你愿意,你就可以运行一个线程。为了做其他工作,它不必返回某个调用者,所以你可以把它放在一个循环中(通常这样做)。循环可以包含任意睡眠。

工作队列用于调用者本身无法执行预期操作的情况,例如因为它是一个中断服务例程并且中断工作太长,或者在中断中运行不合适(因为它需要一个流程上下文。)

答案 1 :(得分:3)

首先,Workqueue也是一个kthread。现在,如果您只是使用默认队列,则将声明工作函数schedule_work() ,这反过来会将你的工作函数添加到该处理器的默认工作队列。这个默认的工作队列只不过是在启动时创建的kthread。

现在关于优势和劣势,工作队列用于一个非常具体的场景:当你想延迟你的工作一段时间。正如@Kaz提到的情况之一可能是当你处于中断处理程序并希望尽快出来时。 因此,对于工作队列,您可以安排工作一段时间,而正常的kthread不能延迟。