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