GMP:
1. G - Goroutine (Golang +Coroutine协程)
2. M - Machine,指的是系统级线程
3. P - Processor,指的是逻辑处理器,P关联了的本地可运行G的队列(也称为LRQ),最多可存放256个G。
GMP调度流程大致如下:
- 线程M想运行任务就需得获取 P,即与P关联。
- 然从 P 的本地队列(LRQ)获取 G
- 若LRQ中没有可运行的G,M 会尝试从全局队列(GRQ)拿一批G放到P的本地队列,
- 若全局队列也未找到可运行的G时候,M会随机从其他 P 的本地队列偷一半放到自己 P 的本地队列。
- 拿到可运行的G之后,M 运行 G,G 执行之后,M 会从 P 获取下一个 G,不断重复下去。
生命周期:
ref:
https://learnku.com/articles/41728
https://go.cyub.vip/gmp/gmp-model.html
https://www.bilibili.com/video/BV1oT411Y7m3