以下摘录解释了Linux 内核中工作队列设计的基础知识。
在最初的 wq 实现中,每个 wq 都维护自己独立的工作池。一个 MT wq 只能为每个 CPU 提供一个执行上下文,而一个 ST wq 为整个系统提供一个。工作项必须竞争那些非常有限的执行上下文,从而导致各种问题。
为了简化函数的异步执行,引入了一个新的抽象,工作项。
工作项是一个简单的结构,它包含一个指向要异步执行的函数的指针。每当驱动程序或子系统想要异步执行一个函数时,它必须设置一个指向该函数的工作项并将该工作项排队到工作队列中。
特殊用途的线程,称为工作线程,一个接一个地执行队列外的功能。如果没有工作排队,工作线程将变为空闲状态。这些工作线程在所谓的线程池中进行管理。
为了消除这些问题,开发了并发管理工作队列(cmwq) 框架。顾名思义,重点是提供最大的并发性,即以最小的开销最小化工作项的阻塞。
各种“WQ_*”标志
1. WQ_HIGHPRI
- 高优先级工作队列的工作项排队到高优先级线程池,该线程池包含具有提升的 nice 级别的工作线程。普通线程池和高优先级线程池不相互交互。每个都维护其单独的工作人员池并在其工作人员之间实施并发管理。
2. WQ_UNBOUND
- 不参与工作队列并发管理。工作项不绑定到特定的 CPU,它可以安排在任何可用的 CPU 上运行。如果需要,还可以唤醒额外的工作线程。
3. WQ_RESCUER
- 已弃用(在最新内核中)。取而代之
WQ_MEM_RECLAIM
。阅读此答案以了解详细信息。
4. WQ_CPU_INTENSIVE
- 不参与工作队列并发管理。相反,它是 CPU 调度程序的责任,就像任何其他任务一样。
Linux-kernel-src/Documentation/workqueue.txt中提供了每个标志的详细描述和当前工作队列设计背后的理念
考虑到上述信息,您的问题的答案是:
所有 4 个工作项都在绑定到特定 CPU 的高优先级线程上排队。
使用WQ_UNBOUND
将允许工作项在任何可用的 CPU 上跨多次运行执行。