差异b/w kthread和工作队列

Cod*_*deQ 6 kernel kernel-module linux-kernel

当他们被创建为以下时,我很困惑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 
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,那么请告诉我kthread优于工作队列的优点,反之亦然.

提前致谢.

Kaz*_*Kaz 6

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

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

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