gpt4 book ai didi

c - 工作队列的这些标志是什么意思?

转载 作者:行者123 更新时间:2023-12-01 23:24:22 25 4
gpt4 key购买 nike

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

  1. 这里的 draining 和 rescuer 到底是什么意思?

    WQ_DRAINING             = 1 << 6, /* internal: workqueue is draining */
    WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */
  2. 为未绑定(bind)工作队列定义的 CPU 数量是 4。如果我有八核处理器怎么办。无界的 wq 将如何绑定(bind)到 cpus。他们如何决定运行哪些 CPU,因为他们现在有 8 个 CPU 而不是 4 个 CPU。是吗,它们可以在 8 个或仅 4 个特定 cpu 中的任何一个上运行?

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

最佳答案

WQ_DRAINING

这个标志用来表示内核当前正在刷新工作队列和新的工作项不能在上面排队。在此阶段只允许当前挂起或正在运行的工作项,直到整个工作队列完全为空。

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


WQ_RESCUER

这个标志在最新的内核中已经被这个 patch 弃用了 并且该行为现在由 WQ_MEM_RECLAIM 标志决定。

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

Workqueue rescuer thread function. There's one rescuer for each workqueue which has WQ_MEM_RECLAIM set.

Regular work processing on a pool may block trying to create a new worker which uses GFP_KERNEL allocation which has slight chance of developing into deadlock if some works currently on the same queue need to be processed to satisfy the GFP_KERNEL allocation. This is the problem rescuer solves.

When such condition is possible, the pool summons rescuers of all workqueues which have works queued on the pool and let them process those works so that forward progress can be guaranteed.


WQ_MAX_UNBOUND_PER_CPU

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

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

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

关于c - 工作队列的这些标志是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17780477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com