Go协程调度机制
此开源图书由ithaiq原创,创作不易转载请注明出处
go的协程调度模型是MPG
主要一句话就是P将G合理的分配到某个M的过程
其中M(work thread)代表工作线程由os提供,P(process)代表处理器又称上下文和CPU核数相关联,不超过GOMAXPROCS的数量,G(goroutine)代表协程。

运行的M绑定一个P
P绑定一个本地的Go协程队列
调度器拥有一个全局的Go协程队列
M从G队列中提取Go协程并执行
查找Go协程的顺序
1/61的几率在全局队列找,60/61的几率在本地队列里找
如果全局队列里找不到G,则从P的本地队列里找
如果还是找不到,则从其他P的本地队列里掠夺
此开源图书由github(ithaiq)原创,创作不易转载请注明出处
发生阻塞的时候
首先M1和P解绑,P获取其他M2执行其本地Go协程队列
M1和阻塞的Go协程保持藕断丝连的关系
阻塞结束,M1找P来接手Go协程,如果没有P则放入全局Go协程队列
M自旋
自旋定义:循环执行代码块虽然耗费CPU但是不休眠
如果M从全局和本地队列都找不到Go协程会进入自旋状态(2M<繁忙P数量),这样不用反复启动新的M性能比较好
最后更新于
这有帮助吗?