会动的图解!GMP模型里为什么要有P?背后的原因让人暖心

GMP图解,大家在网上经常能看到,但是往往不够生动达不到帮助理解的作用,在网上看见一位大佬的动图图解,十分生动,做的也十分用心,分享给大家一起学习

这是一位在字节工作的大佬,网名小白,文章转载自公众号:小白debug

GM模型是什么

79c0ea80d58c53fdf8fcb4a1eda9442b.png
GM图

Go 1.1版本之前,其实用的就是GM模型。

  • G,协程。通常在代码里用  go  关键字执行一个方法,那么就等于起了一个G

  • M内核线程,操作系统内核其实看不见GP,只知道自己在执行一个线程。GP都是在用户层上的实现。

除了GM以外,还有一个全局协程队列,这个全局队列里放的是多个处于可运行状态GM如果想要获取G,就需要访问一个全局队列。同时,内核线程M是可以同时存在多个的,因此访问时还需要考虑并发安全问题。因此这个全局队列有一把全局的大锁,每次访问都需要去获取这把大锁。

并发量小的时候还好,当并发量大了,这把大锁,就成为了性能瓶颈

fa9dd4c6832958e495fae95270bc306b.gif

GM模型

GMP模型是什么

d85da781e0c3d6c3c89e4d9664159473.png
GMP图

基于没有什么是加一个中间层不能解决的思路,golang在原有的GM模型的基础上加入了一个调度器P,可以简单理解为是在GM中间加了个中间层。

于是就有了现在的GMP模型里。

  • P 的加入,还带来了一个本地协程队列,跟前面提到的全局队列类似,也是用于存放G,想要获取等待运行的G,会优先从本地队列里拿,访问本地队列无需加锁。而全局协程队列依然是存在的,但是功能被弱化,不到万不得已是不会去全局队列里拿G的。

  • GM模型里M想要运行G,直接去全局队列里拿就行了;GMP模型里,M想要运行G,就得先获取P,然后从 P 的本地队列获取 G

46116d0df48a016341e48766861e8d51.gif
GMP模型
  • 新建 G 时,新G会优先加入到 P 的本地队列;如果本地队列满了,则会把本地队列中一半的 G 移动到全局队列。

  • P 的本地队列为空时,就从全局队列里去取。

5e56052f0c5ed920c9a9442d7b9993a4.gif

GMP模型-获取全局协程队列
  • 如果全局队列为空时,M 会从其他 P 的本地队列偷(stealing)一半G放到自己 P 的本地队列。

740ee941b3210b9878a2b3fead85ef8b.gif

GMP模型-stealing
  • M 运行 GG 执行之后,M 会从 P 获取下一个 G,不断重复下去。

59b50cb9ab5a54481f06766c93d1c296.gif
GMP模型-循环执行

为什么P的逻辑不直接加在M上

主要还是因为M其实是内核线程,内核只知道自己在跑线程,而golang的运行时(包括调度,垃圾回收等)其实都是用户空间里的逻辑。操作系统内核哪里还知道,也不需要知道用户空间的golang应用原来还有那么多花花肠子。这一切逻辑交给应用层自己去做就好,毕竟改内核线程的逻辑也不合适啊。

如果文章对你有帮助,看下文章底部右下角,做点正能量的事情(点两下)支持一下。(疯狂暗示,拜托拜托,这对我真的很重要!

参考资料

[1]《Golang 调度器 GMP 原理与调度全分析》  ——Aceld :https://learnku.com/articles/41728

[2]《GMP模型为什么要有P》   ——煎鱼 :https://mp.weixin.qq.com/s/an7dml9NLOhqOZjEGLdEEw

[3]《深度解密Go语言之Scheduler》 ——qcrao :https://qcrao.com/2019/09/02/dive-into-go-scheduler/#%E4%BB%80%E4%B9%88%E6%98%AF-scheduler

文章推荐:

别说了,一起在知识的海洋里呛水吧

关注公众号:【小白debug】

- END -

扫码关注公众号「网管叨bi叨」

给网管个星标,第一时间吸我的知识 👆

网管为大家整理了一本超实用的《Go 开发参考书》收集了70多条开发实践。去公众号回复【gocookbook】即刻领取!

觉得有用就点个在看  👇👇👇

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值