G-P-M调度模型
- G:Goroutine,Go协程
- P:Processor,逻辑处理器
- M:Machine,操作系统线程
调度流程
- 但有可以运行的M时,会获取一个可用的P,如果所有的P都被占用,则当前M进入休眠,或进入一段时间的自旋
- P 优先从本地队列中获得 G;如果本地队列为空,则尝试从全局队列中获得 G;如果依旧为空,则尝试从其他的P的本地队列中拉取一般的 G 下来。
- M 执行分配到的 G,一直持续到
- G 自愿让出(如Goshel
- G 被阻塞
- G 被调度器抢占
- 阻塞或抢占的 G 会放回本地或全局队列,等待下一次就绪;执行完毕的 G 会被释放资源
一些细节
P 队列
- 创建 G 的时候,优先插入 P 的本地队列
- 如果 P 的本地队列满了,则分一半到全局队列