c-工作队列在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,则会得到一个工作队列,该工作队列为系统上的每个处理器都有一个专用线程。在许多情况下,所有这些线程都是过度使用;如果一个工作线程就足够了,那么使用createsinglethread_workqueue创建工作队列。

但我无法看到多个工作线程(每个线程对应一个处理器)。

自编写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。

这个文件太大了,无法完全引用,但上面写着:

CCD_ 3分配wq。原始create_*workqueue()函数已弃用,并计划删除
[…]
wq不再管理执行资源,而是充当转发进度保证、刷新和工作项属性。

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);
    }
}

最新更新