我正在处理Linux内核2.6.36中的并发管理工作队列。但我对这些标志感到困惑。
WQ_HIGHPRI
WQ_UNBOUND
WQ_RESCUER
WQ_CPU_INTENSIVE
我创建了一个带有标志WQ_HIGHPRI
的工作队列,并将一些工作项(例如w1 w2 w3 w4,按顺序)排入其中,4个工作项中没有一个会睡觉。
4个工作项是否由同一个线程执行,在这种情况下,是否创建了任何线程?
在上述情况下,使用WQ_UNBOUND
会有什么不同吗?因为如果设置WQ_UNBOUND
,则内核将设置WQ_HIGHPRI
。
提前谢谢。
答案 0 :(得分:1)
以下摘录解释了workqueue design in the Linux kernel的基本知识。
在原始的wq实现中,每个wq都维护着自己独立的工作池。 MT wq每个CPU只能提供一个执行上下文,而ST wq可以为整个系统提供一个执行上下文。工作项必须竞争导致各种问题的非常有限的执行环境。
为了简化函数的异步执行,引入了新的抽象,工作项。
工作项是一个简单的结构,它包含一个指向要异步执行的函数的指针。每当驱动程序或子系统想要异步执行某个函数时,它必须设置一个指向该函数的工作项,并将该工作项排队到工作队列中。
专用线程,称为工作线程,一个接一个地执行队列中的功能。如果没有工作排队,则工作线程将变为空闲状态。这些工作线程在所谓的线程池中进行管理。
为了消除这些问题,已经开发了并发管理工作队列(cmwq)框架。顾名思义,重点是提供最大并发性,即尽可能减少工作项的阻塞。
<强> 1。 WQ_HIGHPRI 强>
<强> 2。 WQ_UNBOUND 强>
第3。 WQ_RESCUER 强>
WQ_MEM_RECLAIM
取代。有关详细信息,请阅读 answer 。<强> 4。 WQ_CPU_INTENSIVE 强>
Linux-kernel-src/Documentation/workqueue.txt
中提供了每个标志的详细描述以及当前工作队列设计背后的理念考虑到上述信息,您的查询答案为:
所有4个工作项都在绑定到特定CPU的高优先级线程上排队。
使用WQ_UNBOUND
将允许在多次运行的任何可用CPU上执行工作项。