Golang 关于 GPM 模型的疑问

Chaoxin · · 1208 次点击
谢谢老哥,明白了
#2
更多评论
1、这个好像没时间片上的概念吧,就是依次执行P队列的G直到完成,只是有可能G会因IO等阻塞,这种的话会把它放在P队列尾执行下一个G。 2、P可以保留上下文Context,而M是不会记录G的状态的,这样的话G可以跨M执行,如果没有P应该不能正常切换。 不一定对
#1
1. 在没有P的GM下,所有G都放在全局队列里,这时如果所有M都去拿G的话,就需要一个全局大锁,性能要下降很多。而引入了P后,每个P有自己的runq,这就解决了大锁互斥的性能问题; 2. 另外一点就是内存问题,GM模型下,内存是M.mcache,当每遇到一个系统调用的时候,就会浪费掉一个M.mcache。引入P后,改为了p.mcache,这样就算系统调用,移走M的话,内存还是在P上,其它G/M还可以使用这块内存; 3. 另外有人说GM还存在goroutine传递问题,暂时未理解这块的说法
#3