专栏首页golang小白成长记动图图解!GMP模型里为什么要有P?背后的原因让人暖心

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

GM模型是什么

GM图

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

  • G,协程。通常在代码里用 go 关键字执行一个方法,那么就等于起了一个G
  • M内核线程,操作系统内核其实看不见GP,只知道自己在执行一个线程。GP都是在用户层上的实现。

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

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

GM模型

GMP模型是什么

GMP图

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

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

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

GMP模型

  • 新建 G 时,新G会优先加入到 P 的本地队列;如果本地队列满了,则会把本地队列中一半的 G 移动到全局队列。
  • P 的本地队列为空时,就从全局队列里去取。

GMP模型-获取全局协程队列

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

GMP模型-stealing

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

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

本文分享自微信公众号 - golang小白成长记(golangxbczj),作者:胖虎

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【修正版】动图图解!GMP模型里为什么要有P?背后的原因让人暖心

    除了G和M以外,还有一个全局协程队列,这个全局队列里放的是多个处于可运行状态的G。M如果想要获取G,就需要访问一个全局队列。同时,内核线程M是可以同时存在多个的...

    9号同学
  • 程序化创意(Programmatic Creative Platform)

    这一节来介绍一个大家比较少接触,也比较少听的东西,但一举个实际的例子,不少人可能会说:哦,原来这个就是。这一节要带大家认识的就是程序化创意(Programmat...

    GA小站
  • 洪灾、山火、暴雪,在VR/AR中我们能为环保做什么?

    (VRPinea2月24日讯)全球变暖、冰川融化、澳大利亚山火、阿富汗洪灾……越来越多的自然灾害在非自然地发生。甚至在上周,一场暴风雪席卷了美国德州的大部分地区...

    VRPinea
  • Go调度器系列(2)宏观看调度器

    上一篇文章《Go语言高阶:调度器系列(1)起源》,学goroutine调度器之前的一些背景知识,这篇文章则是为了对调度器有个宏观的认识,从宏观的3个角度,去看待...

    大彬
  • Go调度器系列(2)宏观看调度器

    上一篇文章《Go语言高阶:调度器系列(1)起源》,学goroutine调度器之前的一些背景知识,这篇文章则是为了对调度器有个宏观的认识,从宏观的3个角度,去看待...

    大彬
  • golang 重要知识:golang 调度

    Go 的调度机制相当于我们微服务里的基础组件。很多运行时操作都涉及到了调度的关联。本文会细聊调度概念,策略,以及它的机制。当然,也少不了最常提及的 GMP 模型...

    lincoln
  • 「Adobe国际认证」设计小白必须了解的色彩理论,绝对干货满满

    有时,两种或三种颜色搭配在一起看起来很合适。我们却无法解释为什么,但我们知道这是对的。

    IT胶囊
  • MySQL 8.0.22 源码编译安装全过程

    墨墨导读: Mysql的8.0版本出来已经有一段时间了,近期研究下源码调试。整个编译过程越来越复杂了。

    数据和云
  • 动图图解!既然IP层会分片,为什么TCP层也还要分段?

    在网络层(IP层),叫分片。(注意以下提到的IP没有特殊说明的情况下,都是指IPV4)

    9号同学
  • 暖暖系列第四弹《闪耀暖暖》上线服务器即崩盘!台服开放VR功能超吸睛~

    说起暖暖系列,其实小编也曾入过坑,包括小编周围的许多朋友也都非常喜欢。从《暖暖环游世界》、《奇迹暖暖》到《暖暖的换装物语》,各色不一样的服装,真的满满都是少女心...

    VRPinea
  • U-GAT-IT笔记

    由于博客园有时候公式显示不出来,建议在https://github.com/FangYang970206/PaperNote/blob/master/GAN/U...

    努力努力再努力F
  • 独家丨大数据预测:帝都重污染红色预警、全球气候变暖都“不算事儿”

    ---- 本周雾霾再次强势来袭,北京首次启动重污染红色预警,不戴口罩出门让人压力山大。与此同时,2015联合国气候大会在巴黎也接近尾声。此次大会中国角的低碳主题...

    数据猿
  • golang的线程模型——GMP模型

    内核线程(Kernel-Level Thread ,KLT) 轻量级进程(Light Weight Process,LWP):轻量级进程就是我们通常意义上所讲的...

    benny
  • 这是他们给奶奶最好的母亲节礼物(爷爷也有份)

    垃圾分类后,我奶奶总是拿不准怎么分。如果拍张照片,就能识别手上的废弃物是哪类垃圾就好了。

    腾讯云开发TCB
  • 火了!清华博士发现微信抢最大红包秘笈!为此他发了2亿个红包

    我叫毕啸天,现在是清华大学化学工程系的一名直博四年级的学生。因为我之前做过本科的辅导员,所以大家都叫我毕导。

    华章科技
  • 空间小窝:萌是一种怎样的体验 - 腾讯ISUX

    腾讯ISUX
  • 从反序列化到类型混淆漏洞——记一次 ecshop 实例利用

    本文初完成于2020年3月31日,由于涉及到0day利用,所以于2020年3月31日报告厂商、CNVD漏洞平台,满足90天漏洞披露期,遂公开。

    Seebug漏洞平台
  • 【案例复盘】顺丰速运UI界面设计细节深入解析

    静电说:顺丰一直都是静电非常喜欢的快递公司,服务好,门到门服务,快递员素质高态度好。当然,还有更重要的因素,顺丰也很注意自身形象的建设,不管是统一的logo标志...

    用户5009027
  • PHP编译安装

    #wgethttp://museum.php.net/php5/php-5.2.6.tar.gzPHP

    Java架构师必看

扫码关注云+社区

领取腾讯云代金券