对码当歌,猿生几何?

GO-GMP线程模型

介绍

  • G用户态线程

  • M系统线程

  • P处理器,作为M和G的桥梁,负责G的调度和执行.调度器启动时就会创建GOMAXPROCS个处理器。

  • 每个处理器都有一个本地空闲队列和运行队列,全局环境各维护着一个空闲队列和运行队列。

调度流程

获取可用的G

  1. 首先从P的本地空闲队列获取可用的G 

  2. 如果没有则从全局空闲队列获取,从全局队列获取时,则会最多同步32个free的G到P的本地free队列.

  3. 如果没有则创建一个G

  4. 拿到G后,如果next设置为true, 会有1/2的机会将G放在P的本地队列的next上执行,否则放在P的本地运行队列队末,此时如果本地队里已满,则会触发本地运行队列向全局运行队列迁移动作,期间本地运行队列的一半将迁移到全局运行队列

调度

  1. 首先以1/60的概率从全局运行列获取可用的G。 期间可能会触发全局运行队列向本地运行队列迁移的动作,此时会拿全局队列的 1/GOMAXPROCS去填充本地运行队列,直到本地队列满或者填充完成为止

  2. 从本地队列获取可运行的G。首先从处理器的next获取,如果没有则从运行队列队首获取

  3. 如果还没有则从全局队列继续获取,重复1的过程,但是没有1/60的概率,是必须从全局获取

  4. 如果还没有则随机从一个其他的处理器运行队列窃取一半的任务到本处理器上

退出

  1. 执行完成将G的栈等数据清空放在本地空闲队列上,如果此时的本地空闲队列长度大于64,则将大于32的部分分成notack和stack两部分放在全局空闲队列上