为什么 CLR ThreadPool 工作线程使用 LIFO 命令来处理来自本地队列的任务?

Piy*_*agi 2 .net c# clr threadpool

背景:

当任务被非工作线程调度由线程池中的工作线程处理时,它们进入一个全局队列。工作线程使用此全局队列以FIFO先进先出)顺序获取要处理的任务。这是有道理的,因为最先安排的任务应该最先完成。

现在,如果工作进程正在处理任务并产生新的子任务,它们将存储在进程的本地队列中。当工作进程完成其当前任务时,它会检查本地队列并使用LIFO后进先出)顺序从队列中提取任务。

[编辑] 来源:

  1. CLR via C#,第 4 版,Jeffrey Richter(第 725 页)
  2. Microsoft 的任务计划程序文档

题:

在本地队列中使用 LIFO 顺序背后的基本原理是什么?

Mat*_*son 5

这在Microsoft 的任务调度程序文档中明确提到:

本地队列按后进先出顺序 (LIFO) 访问,以保留缓存位置并减少争用。

Joe Duffy 也在此处对此进行了更多讨论。他说:

1) 通过以 LIFO 顺序执行最近推入队列的工作,与它相关的内存可能在缓存中仍然很热。

2) 通过按 FIFO 顺序窃取,可能会窃取更大的“块”工作(可能会减少需要额外窃取的机会)。这样做的原因是许多窃取工作负载的工作本质上是分而治之的;在这种情况下,递归形成一棵树,队列中最旧的项目离根更近;因此,隐式窃取其中一个也会窃取一个(潜在的)大型计算子树,一旦该工作被窃取并运行,该子树就会展开。