填满 P 本地运行队列的 Go Scheduler?

Go Scheduler who fills the local runqueue of P?

看看这张取自 morsmachine.dk/go-scheduler

的著名图片

灰名单是 P 的本地运行队列。如果这个队列变空,它们将被全局运行队列中的 go routines 填充.

问题是,谁来填充 P 的 local runqueue

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

P.S。文章省略了这些信息。

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

函数 schedule(调度程序)调用 findrunnable,它试图从另一个 P 窃取 G。如果失败,它将 return 来自全局 运行 队列的 G。然后 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.

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