当他们被创建为以下时,我很困惑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相对于工作区有什么好处,反之亦然。
提前致谢。
答案 0 :(得分:6)
"工作"是一些应该在合理的时间内完成的行动。虽然它可以睡觉,但它不应该长时间这样做,因为多个工作项共享同一个工作线程。
只要你愿意,你就可以运行一个线程。为了做其他工作,它不必返回某个调用者,所以你可以把它放在一个循环中(通常这样做)。循环可以包含任意睡眠。
工作队列用于调用者本身无法执行预期操作的情况,例如因为它是一个中断服务例程并且中断工作太长,或者在中断中运行不合适(因为它需要一个流程上下文。)
答案 1 :(得分:3)
首先,Workqueue也是一个kthread。现在,如果您只是使用默认队列,则将声明工作函数schedule_work()
,这反过来会将你的工作函数添加到该处理器的默认工作队列。这个默认的工作队列只不过是在启动时创建的kthread。
现在关于优势和劣势,工作队列用于一个非常具体的场景:当你想延迟你的工作一段时间。正如@Kaz提到的情况之一可能是当你处于中断处理程序并希望尽快出来时。 因此,对于工作队列,您可以安排工作一段时间,而正常的kthread不能延迟。