去调度程序填充P的本地运行队列?

die*_*ter 5 scheduler go

看看这张来自morsmachine.dk/go-scheduler的著名图像

在此处输入图片说明

灰色列表是P的本地运行队列。如果此队列为空,则将使用全局运行队列中的 go例程填充它们。

问题是,谁填补了P 的本地队列

调度程序,没有同步或每个P都自己做(互斥体)?

PS本文忽略了此信息。

thw*_*hwd 5

所有这些都来自golang.org/src/runtime/proc.go

函数schedule(调度程序)调用findrunnable试图G从另一个P. 如果失败,它将G从全局运行队列中返回 a 。这G是然后在“当前”执行M

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

// 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.
Run Code Online (Sandbox Code Playgroud)

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