文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复【教程】获golang免费视频教程。本文已经收录在GitHub https://github.com/xiaobaiTech/golangFamily , 有大厂面试完整考点和成长路线,欢迎Star。

GM模型是什么

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

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

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

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

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

GMP模型是什么

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

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

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

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

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

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

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

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

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

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

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

我是小白,我们下期见。

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

关注公众号:【golang小白成长记】

本文由博客一文多发平台 OpenWrite 发布!

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

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

    GMP图解,大家在网上经常能看到,但是往往不够生动达不到帮助理解的作用,在网上看见一位大佬的动图图解,十分生动,做的也十分用心,分享给大家一起学习 这是一位在字节工作的大佬,网名小白,文章转载自公众号 ...

  2. 动图图解!既然IP层会分片,为什么TCP层也还要分段?

    文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://github.com/xiaobaiTech/g ...

  3. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  4. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  5. 动图图解 | Go 的 timer 是如何被Runtime调度的?

    本篇文章剖析下 Go 定时器的相关内容.定时器不管是业务开发,还是基础架构开发,都是绕不过去的存在,由此可见定时器的重要程度. 我们不管用 NewTimer, timer.After,还是 timer ...

  6. 十大经典排序算法动图图解

    转载:http://web.jobbole.com/87968/ 0.排序算法说明0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之 ...

  7. 经典排序算法动图图解

    目录 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序(Insertion Sort) 4.希尔排序(Shell Sort) 5.归并排序(Merge ...

  8. 动图图解GC算法 - 让垃圾回收动起来

    原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处. 提到Java中的垃圾回收,我相信很多小伙伴和我一样,第一反应就是面试必问了,你要是没背过点GC算法.收集器什么 ...

  9. 【玩转链表①】单链表动图图解(超详解)

    学习导航 一.前言 二.快速入门链表 ①漫画图解 ②与顺序表的区别 三.链表接口的实现 ①准备函数 ②尾插和头插 ③头删和尾删 ④查找 ⑤向后插入向后删除 ⑥向前插入向前删除 ⑦向前插入pos节点处删 ...

最新文章

  1. 软件项目技术方案_榆林化学公司项目工艺包关键技术创新方案审查顺利完成
  2. Android 线程管理
  3. 青龙羊毛——可推(搬运)
  4. 企业网络推广专员浅析是否网站权重越高企业网络推广效果越好?
  5. 人性 - 社会 - 经济 - 科学
  6. 【手撸RPC框架】SpringBoot+Netty4实现RPC框架
  7. MyBatis笔记——EhCache二级缓存
  8. CODEVS——T1519 过路费
  9. jQuery 往table添加新内容有以下四个方法:
  10. TWaver HTML5 + Node.js + express + socket.io + redis(五)
  11. spring获取webapplicationcontext,applicationcontext几
  12. 各大排序算法的Objective-C实现以及图形化演示比较
  13. python程序的装修【文件可执行权限】【__name__】
  14. 如何推导高斯过程回归以及深层高斯过程详解
  15. 安装用友U8的常见错误
  16. 2019莆田学院c语言试卷,莆田学院C语言程序设计模拟试卷_文库吧
  17. java中的反射技术
  18. EXCEL基本功能 --- 三种常用的查找与引用函数
  19. 上海黄金交易所交易操作基本知识
  20. java中关于输出三角形图案类型题目的思路

热门文章

  1. Ticwatch1折腾
  2. base64格式图片转换成二进制流并生成图片文件
  3. APP性能监测工具之友盟的 U-APM产品入门使用
  4. spring aop 注解
  5. 解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 0: illegal multibyte sequence问题
  6. Git之GitFlow工作流 | Gitflow Workflow(万字整理,已是最详)
  7. 解方程之直接开平方法
  8. iOS获取健康步数从加速计到healthkit
  9. 蒙特卡洛树实现黑白棋
  10. 阿布云代理的使用方法