有关内核中的workqueue的一些标志

我正在处理Linux内核2.6.36中的并发pipe理工作队列。但是我对一些标志感到困惑。

  • WQ_HIGHPRI
  • WQ_UNBOUND
  • WQ_RESCUER
  • WQ_CPU_INTENSIVE

我创build了一个带有标志WQ_HIGHPRI工作队列,并将一些工作项目(例如w1 w2 w3 w4,按顺序)排队,这四个工作项目都不会进入hibernate状态。

  1. 4个工作项是否由同一个线程执行,在这种情况下是否创build了任何线程?

  2. 在上面的情况下,如果使用WQ_UNBOUND ,是否有区别? 因为如果你设置了WQ_UNBOUND ,那么内核将设置WQ_HIGHPRI

先谢谢你。

Solutions Collecting From Web of "有关内核中的workqueue的一些标志"

以下摘录解释了Linux内核中工作队列设计的基础知识。

在原来的wq实现中,每个wq都维护着自己独立的工作池。 一个MT wq只能为每个CPU提供一个执行上下文,而一个ST wq只能为整个系统提供一个执行上下文。 工作项目必须争夺那些非常有限的执行环境,导致各种问题。

为了减轻函数的异步执行,引入了一个新的抽象, 工作项目

工作项是一个简单的结构,它包含一个指向要异步执行的函数的指针。 只要驱动程序或子系统想要异步执行某个功能,就必须设置一个指向该功能的工作项,并将该工作项列入工作队列。

称为工作者线程的特殊用途线程依次执行队列之外的功能。 如果没有工作排队,工作线程变得空闲。 这些工作线程在所谓的线程池中进行管理。

为了消除这些问题,开发了并发管理工作队列 (cmwq)框架。 顾名思义,重点是提供最大的并发性,即尽可能减少工作项目的阻塞。


各种“WQ_ *”标志

1. WQ_HIGHPRI

  • 高优先级工作队列的工作项排入高优先级线程池,该高优先级线程池包含提升级别较高的工作线程。 正常和高优先级线程池不会相互影响。 各自维护着不同的工作人员,并在其工作人员中实施并发管理。

2. WQ_UNBOUND

  • 不参与workqueue并发管理。 工作项不绑定到特定的CPU,并且可以安排在任何可用的CPU上运行。 如果需要的话,额外的工作线程也可能被唤醒。

3. WQ_RESCUER

  • 已弃用(在最新的内核中)。 被WQ_MEM_RECLAIM取代。 阅读这个答案的细节。

4. WQ_CPU_INTENSIVE

  • 不参与workqueue并发管理。 相反,它就像任何其他任务一样是CPU调度程序的责任。

每个标志和当前工作队列设计背后的哲学的详细描述可以在Linux-kernel-src / Documentation / workqueue.txt


考虑到上述信息,您的查询的答案是:

  1. 所有4个工作项都在绑定到特定CPU的高优先级线程上排队。

  2. 使用WQ_UNBOUND将允许工作项在多个运行的任何可用CPU上执行。