填满 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)
。
看看这张取自 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)
。