Go协程调度机制

此开源图书由ithaiq原创,创作不易转载请注明出处

go的协程调度模型是MPG

  • 主要一句话就是P将G合理的分配到某个M的过程

其中M(work thread)代表工作线程由os提供,P(process)代表处理器又称上下文和CPU核数相关联,不超过GOMAXPROCS的数量,G(goroutine)代表协程。

  1. 运行的M绑定一个P

  2. P绑定一个本地的Go协程队列

  3. 调度器拥有一个全局的Go协程队列

  4. 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性能比较好

最后更新于

这有帮助吗?