GPM模型包括哪些内容?
- 全局队列:存放等待运行的G
- P的本地队列:存放的也是等待运行的G,最多不超过不超过256个,新建G时,G优先加入到P的本地队列,如果队列满了,则会把本地队列中一半的G移动到全局队列。
- P:处理器,在程序启动时创建,最多GOMAXPROCS个,GOMAXPROCS默认为CPU的硬件线程数目
- M:从P的本地队列获取G,P队列为空时,M也会尝试从全局队列拿一批G放到P的本地队列,或从其他P的本地队列偷一半放到自己P的本地队列。当M阻塞了,会创建新的M
P和M的关系
M与P的数量没有绝对关系,一个M阻塞,P就会去创建或者切换另一个M
P的设计策略
1. work stealing机制
当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。
2. hand off机制
当本线程因为G进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行。
P的作用
把可运行的goroutine分配到工作线程上
N:1关系
N个协程绑定1个线程,优点就是协程在用户态线程即完成切换,效率高,但一旦某协程阻塞,造成线程阻塞,所有协程无法执行
1:1 关系
1个协程绑定1个线程,cpu消耗高
M:N关系
m个协程通过处理器绑定n个线程,解决以上两种问题,实现较复杂
详细
https://www.jianshu.com/p/fa696563c38a