为什么我们在Go调度器的设计中添加P而不是简单地更改M?

为什么我们在Go调度器的设计中添加P而不是简单地更改M?,go,scheduler,software-design,Go,Scheduler,Software Design,正如我们所知,从Go 1.0到Go 1.1,Go调度器最重要的改进是在GM中添加p以生成GPM。我们可以在那里看到原始设计文件 我不明白为什么我们要添加p来存储本地runq和mcache,而不是简单地将这些东西放在M中。俗话说,“如果没有必要,就不会添加实体性”。 很明显,前者添加了一个实体,而后者没有 为什么我们选择前者?我很肯定“如果没有必要,就不会增加实质性”不是一句谚语;然而,我认为这是奥卡姆剃刀的一个变种:不要不必要地增加实体。然而,当涉及到进程调度时,“P”(处理器)并不是多余的概念

正如我们所知,从Go 1.0到Go 1.1,Go调度器最重要的改进是在GM中添加p以生成GPM。我们可以在那里看到原始设计文件

我不明白为什么我们要添加p来存储本地runq和mcache,而不是简单地将这些东西放在M中。俗话说,“如果没有必要,就不会添加实体性”。 很明显,前者添加了一个实体,而后者没有


为什么我们选择前者?

我很肯定“如果没有必要,就不会增加实质性”不是一句谚语;然而,我认为这是奥卡姆剃刀的一个变种:不要不必要地增加实体。然而,当涉及到进程调度时,“P”(处理器)并不是多余的概念——如果您缺少与运行进程的底层硬件相对应的任何概念(除了处理器的最大数量和空闲数量),那么您的调度实际上太抽象了。我不是Go调度器方面的专家,在与它相关的文章中发现了几个问题元素,但改进的核心似乎与“工作窃取”的实现有关,即空闲Ps尝试从其他Ps窃取等待的Gs。这是有效的,因为P知道它何时变为空闲,而M本身并不知道闲置硬件。

我想这是一句非英语的谚语,已经翻译过了。它也可能是亲密朋友之间的谚语,或者其他什么。任何东西都可以是一句谚语,只要它不止一次地说:)@Flimzy是的,我不是英语母语的人,这只是一句翻译过来的谚语。@see-sharper-Occam's Razor正是我想引用的。@see-sharper-Occam's Razor我可以这样理解你的答案吗:它给通用汽车增加P的主要原因是因为它想实施“偷工”如果只有M,则无法实现。