【问题标题】:Workqueue implementation in Linux KernelLinux内核中的工作队列实现
【发布时间】:2014-09-28 07:34:47
【问题描述】:

谁能帮我理解下面提到的 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 创建工作队列。

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

【问题讨论】:

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


    【解决方案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 不再管理执行资源,而是作为域 前进进度保证、刷新和工作项属性。

    【讨论】:

      【解决方案2】:
      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);
          }
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2012-03-06
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多