在研究工作队列时,我遇到了workqueue标志&内核中定义的常量。我有以下疑虑,我无法理解。
-
究竟是什么让人精疲力竭;救援人员是指这里?
WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */ WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */
-
为未绑定工作队列定义的CPU数量为4。如果我有一个八核处理器怎么办。无界wq将如何与cpus有界。他们是如何决定运行哪些CPU的,因为他们现在有8个CPU而不是4个CPU。是这样吗,它们可以在8个或只有4个特定cpu中的任何一个上运行?
WQ_MAX_UNBOUND_PER_CPU=4,/*4*#cpus用于未绑定的WQ*/
WQ_DRAINING
此标志用于指示内核当前正在刷新工作队列和新的工作项无法在其上排队。在此阶段,只有当前挂起或正在运行的工作项才允许排队,直到整个工作队列完全为空。
有关详细信息,请查看drain_workqueue()
在kernel/workqueue.c
中的实现。
WQ_RESCUER
此补丁已经在最新的内核中否决了此标志,现在行为由WQ_MEM_RECLAIM
标志决定。
就"救援者"功能而言,以下是来自kernel/workqueue.c
、的相关文档部分
工作队列救援线程函数。每人有一名救援人员已设置WQ_MEM_RECLAIM的工作队列。
对池的常规工作处理可能会阻止尝试创建新的使用GFP_KERNEL分配的工人如果某些当前在同一队列上工作,则会发展为死锁需要进行处理以满足GFP_ KERNEL分配。这是救援者解决了问题。
当这种情况可能发生时,游泳池会召集所有救援人员工作队列,其中有在池中排队的工作并让它们处理这些工作是为了保证向前的进展。
WQ_MAX_unboundd_PER_CPU
(与您的解释相反,WQ_MAX_UNBOUND_PER_CPU不是CPU的数量。它是可以与CPU关联的工作队列的数量。)
工作队列传统上是每个cpu的,即每个工作队列都与特定的cpu相关联,由于缓存的位置性,因此性能更好。内核调度程序别无选择,只能将其始终调度在定义的cpu上。在当前的体系结构中,这会导致功耗增加,因为即使是单个工作队列也可以防止cpu空闲和关闭。因此引入了未绑定的工作队列。调度器可以自由地在任何cpu上重新调度未绑定的工作队列。
这样的工作队列的总数被限制为WQ_UNBOUND_MAX_ACTIVE
,其被定义为num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU
(直到由WQ_MAX_ACTIVE
确定的系统中的总工作队列的限制)。