1.概述
golang本质就是GPM三个实体实现的调度。
G对应每个任务,P对应每个processor概念(就是会包含一堆的G,比如先执行G1,在执行G2)M对应系统线程,M(还包含系统栈之类的概念)绑定一个P之后就开始逐个运行P里面的G。
最基本的流程图就是雨痕给的
后面雨痕对于GPM三者的解释也很到位。我这里不抄袭了。
2.初始化
首先介绍的就是schedinit()里面主要是procresize函数。
这个procresize()就是调整系统里面P的数量。一般就是系统的cpu内核的数量,初始化时也实行多退少补的原则,只是退的时候要注意是否退出的P包含了当前P,如果是就需要一大堆的细节上的处理。
这里还有个所有P的管理结构
var allp [_MaxGomaxprocs + 1]*p
type schedt struct {
pidle puintptr // P
npidle uint32 // P