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

时间:2013-07-22 05:25:58

标签: linux-kernel scheduled-tasks interrupt-handling

在研究工作队伍时,我遇到了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个特定的cpus中的任何一个?

    WQ_MAX_UNBOUND_PER_CPU = 4,/ * 4 * #cpus for unbound wq * /

1 个答案:

答案 0 :(得分:4)

WQ_DRAINING

此标志用于指示内核当前正在刷新工作队列和新工作项 不能排队等候。在此阶段,只允许当前待处理或正在运行的工作项,直到整个工作队列完全为空。

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


WQ_RESCUER

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

至于&#34;救援者&#34;功能方面,这里是kernel/workqueue.c

文档的相关部分
  

Workqueue救助者线程功能。每个人都有一名救援人员   具有WQ_MEM_RECLAIM设置的workqueue。

     

池上的常规工作处理可能会阻止尝试创建新的   使用GFP_KERNEL分配的工人有轻微的机会   如果某些工作当前在同一队列中,则会陷入死锁   需要进行处理以满足GFP_KERNEL分配。这是   救援人员解决的问题。

     

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


WQ_MAX_UNBOUND_PER_CPU

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

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

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