Go计划程序谁填充P的本地运行队列?

Go计划程序谁填充P的本地运行队列?,go,scheduler,Go,Scheduler,请看这张著名的照片 灰色列表是p的本地运行队列。如果该队列变为空,它们将由全局运行队列中的go例程填充 问题是,谁填充了p的本地运行队列 调度器,没有同步或每个p自己做(互斥) 另外,本文省略了这些信息。所有这些信息都来自: 函数schedule(调度程序)调用findrunnable,试图从另一个p窃取G。如果失败,它将从全局运行队列返回一个G。然后在“当前”M上执行该G 此外,schedule偶尔检查全局运行队列的“公平性”: 在所有这些操作中,只涉及一个锁,即lock(&sched.lo

请看这张著名的照片

灰色列表是p的本地运行队列。如果该队列变为空,它们将由全局运行队列中的go例程填充

问题是,谁填充了p的本地运行队列

调度器,没有同步或每个p自己做(互斥)

另外,本文省略了这些信息。

所有这些信息都来自:

函数
schedule
(调度程序)调用
findrunnable
,试图从另一个
p
窃取
G
。如果失败,它将从全局运行队列返回一个
G
。然后在“当前”
M
上执行该
G

此外,
schedule
偶尔检查全局运行队列的“公平性”:


在所有这些操作中,只涉及一个锁,即
lock(&sched.lock)

好的。这意味着每M执行一个锁,但它没有填充本地运行队列,它只需要一个锁并执行它。因此,本地运行队列在变为空后将不会再次填充。如果我们有32个CPU,因此32个M,它们将通过互斥锁(锁)进行同步。是吗?代码有点难读(因为它是自动翻译的C),但是是的,它似乎就是这样工作的。链接已经失效了
// Check the global runnable queue once in a while to ensure fairness.
// Otherwise two goroutines can completely occupy the local runqueue
// by constantly respawning each other.