Content #
在 Go 1.1 版本中实现了 G-P-M 调度模型和work stealing 算法,这个模型一直沿用至今。模型如下图所示:
有人说过:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”,德米特里 - 维尤科夫的 G-P-M 模型恰是这一理论的践行者。你可以看到,德米特里 - 维尤科夫通过向 G-M 模型中增加了一个 P,让 Go 调度器具有很好的伸缩性。
P 是一个“逻辑 Proccessor”,每个 G(Goroutine)要想真正运行起来,首先需要被分配一个 P,也就是进入到 P 的本地运行队列(local runq)中。对于 G 来说,P 就是运行它的“CPU”,可以说:在 G 的眼里只有 P。但从 Go 调度器的视角来看,真正的“CPU”是 M,只有将 P 和 M 绑定,才能让 P 的 runq 中的 G 真正运行起来。