Linux内核中的WorkQueue实现

时间:2014-09-28 07:34:47

标签: linux-kernel linux-device-driver embedded-linux

请任何人帮助我理解Linux内核中下面提到的API之间的区别:

struct workqueue_struct *create_workqueue(const char *name); 
struct workqueue_struct *create_singlethread_workqueue(const char *name);

我编写了示例模块,当我尝试使用“ps -aef”看到它们时,两者都创建了一个工作队列,但我没有看到任何差异。

我已提到http://www.makelinux.net/ldd3/chp-7-sect-6,并根据LDD3:

  

如果您使用 create_workqueue ,则会获得一个工作队列,该队列在系统上具有专用线程,用于每个处理器。在许多情况下,所有这些线程都是过度杀伤;如果单个工作线程就足够了,请改为使用create_singlethread_workqueue创建工作队列。

但我无法看到多个工作线程(每个都用于处理器)。

2 个答案:

答案 0 :(得分:1)

自LDD3编写以来,工作队列已发生变化。

这两个函数实际上是宏:

#define create_workqueue(name)                                          \
        alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name))
#define create_singlethread_workqueue(name)                             \
        alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name))

alloc_workqueue文档说:

  

使用指定的参数分配工作队列。详细说明   有关WQ_ *标志的信息,请参阅Documentation/workqueue.txt

该文件太大而无法完全引用,但它说:

  

alloc_workqueue()分配一个wq。原create_*workqueue()   函数已弃用并计划删除   [...]
  wq不再管理执行资源,而是作为域的域   正向进度保证,冲洗和工作项属性。

答案 1 :(得分:-1)

if(singlethread){

    cwq = init_cpu_workqueue(wq, singlethread_cpu);
    err = create_workqueue_thread(cwq, singlethread_cpu);
    start_workqueue_thread(cwq, -1);

}else{

    list_add(&wq->list, &workqueues);
    for_each_possible_cpu(cpu) {    
                cwq = init_cpu_workqueue(wq, cpu);
                err = create_workqueue_thread(cwq, cpu);
                start_workqueue_thread(cwq, cpu);
    }
}