工作队伍的这些标志是什么意思?

问题描述 投票:3回答:1

在研究工作队列时,我遇到了内核中定义的WorkQueue标志和常量。我有一些我无法理解的怀疑。

  1. 究竟什么是排水和救援人员的意思? WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */ WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */
  2. 为未绑定的工作队列定义的CPU数量是4.如果我有一个octa核心处理器怎么办?无限的wq如何与cpus绑定。他们如何决定运行哪些CPU,因为他们现在有8个cpus而不是4个cpu。是这样,他们可以运行8个或只有4个特定的cpu? WQ_MAX_UNBOUND_PER_CPU = 4,/ * 4 * #cpus表示未绑定的wq * /
linux-kernel scheduled-tasks interrupt-handling
1个回答
4
投票

WQ_DRAINING

此标志用于指示内核当前正在刷新工作队列,并且新工作项无法在其上排队。在此阶段,只允许当前待处理或正在运行的工作项,直到整个工作队列完全为空。

有关详细信息,请查看drain_workqueue()kernel/workqueue.c的实现。


WQ_RESCUER

此标志已在此patch的最新内核中弃用,现在行为由WQ_MEM_RECLAIM标志确定。

就“救助者”功能而言,这里是kernel/workqueue.c的相关文档部分,

Workqueue救援线程功能。每个工作队列都有一个救援人员,其中设置了WQ_MEM_RECLAIM。

池上的常规工作处理可能阻止尝试创建使用GFP_KERNEL分配的新工作程序,如果当前在同一队列上的某些工作需要处理以满足GFP_KERNEL分配,则该分配很可能发展成死锁。这是救援人员解决的问题。

当这种情况成为可能时,游泳池会召集所有工作队列的救援人员,这些工作队员在游泳池上排队,让他们处理这些工作,以保证前进。


WQ_MAX_UNBOUND_PER_CPU

(与你如何解释它相反,WQ_MAX_UNBOUND_PER_CPU不是cpus的数量。它是可以与cpu相关联的工作队列数。)

工作队列传统上是每个cpu,即每个工作队列与特定的cpu相关联,由于缓存局部性导致更好的性能。内核调度程序没有选择,只能在它定义的cpu上安排它。在当前的体系结构中,这导致功耗增加,因为即使单个工作队列也可以防止cpu空闲和关闭。因此引入了无约束的工作队列。调度程序可以在任何cpu上自由地重新调度未绑定的工作队列。

这种工作队列的总数限制为WQ_UNBOUND_MAX_ACTIVE,其定义为num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU(由WQ_MAX_ACTIVE确定的系统中总工作队列的限制)。

© www.soinside.com 2019 - 2024. All rights reserved.