Go GMP 模型为什么要有 P ?详解

GM 模型是怎样的?

在 Go v1.1 之前,实际上 GMP确实是没有 P 的,所有的 M 线程都要从 全局队列中获取 G 来执行任务,为了避免冲突,从全局队列中获取 G 的时候,要先获取一把大锁。

当一个程序的并发量比较小的时候,影响还不大,而当程序的并发量非常大的时候,这个全局队列会成为性能的瓶颈。

除此之外 ,若直接把 G 从全局队列分配给 M,那么当 G 中当生系统调用或者其他阻塞性的操作时,M 会有一段时间处于挂起的状态,此时又没有新创建线程的线程来代替该线程继续从队列中取出其他 G 来运行,从效率上其实会打折扣。

P 带来的改变

加了 P 之后会带来什么改变呢?

教程来源于Github,感谢iswbm大佬的无私奉献,致敬!

技术教程推荐

零基础学Python -〔尹会生〕

黄勇的OKR实战笔记 -〔黄勇〕

网络编程实战 -〔盛延敏〕

分布式系统案例课 -〔杨波〕

恋爱必修课 -〔李一帆〕

操作系统实战45讲 -〔彭东〕

快手 · 移动端音视频开发实战 -〔展晓凯〕

商业思维案例笔记 -〔曹雄峰〕

结构学习力 -〔李忠秋〕