关于内核中workqueue的一些标志

时间:2013-08-04 02:25:14

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

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

  • WQ_HIGHPRI
  • WQ_UNBOUND
  • WQ_RESCUER
  • WQ_CPU_INTENSIVE

我创建了一个带有标志WQ_HIGHPRI的工作队列,并将一些工作项(例如w1 w2 w3 w4,按顺序)排入其中,4个工作项中没有一个会睡觉。

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

  2. 在上述情况下,使用WQ_UNBOUND会有什么不同吗?因为如果设置WQ_UNBOUND,则内核将设置WQ_HIGHPRI

  3. 提前谢谢。

1 个答案:

答案 0 :(得分:1)

以下摘录解释了workqueue design in the Linux kernel的基本知识。

  

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

     

为了简化函数的异步执行,引入了新的抽象,工作项

     

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

     

专用线程,称为工作线程,一个接一个地执行队列中的功能。如果没有工作排队,则工作线程将变为空闲状态。这些工作线程在所谓的线程池中进行管理。

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


各种“WQ_ *”标志

<强> 1。 WQ_HIGHPRI

  • 高优先级工作队列的工作项排队到高优先级线程池,其中包含具有提升级别的工作线程。普通和高优先级线程池不会相互交互。每个人都维护着独立的工作池,并在其工作者之间实现并发管理。

<强> 2。 WQ_UNBOUND

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

第3。 WQ_RESCUER

  • 已弃用(在最新的内核中)。被WQ_MEM_RECLAIM取代。有关详细信息,请阅读 answer

<强> 4。 WQ_CPU_INTENSIVE

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

Linux-kernel-src/Documentation/workqueue.txt

中提供了每个标志的详细描述以及当前工作队列设计背后的理念

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

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

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