会动的图解!GMP模型里为什么要有P?背后的原因让人暖心
GMP图解,大家在网上经常能看到,但是往往不够生动达不到帮助理解的作用,在网上看见一位大佬的动图图解,十分生动,做的也十分用心,分享给大家一起学习
这是一位在字节工作的大佬,网名小白,文章转载自公众号:小白debug
GM模型是什么
在 Go 1.1
版本之前,其实用的就是GM
模型。
G,协程。通常在代码里用
go
关键字执行一个方法,那么就等于起了一个G
。M,内核线程,操作系统内核其实看不见
G
和P
,只知道自己在执行一个线程。G
和P
都是在用户层上的实现。
除了G
和M
以外,还有一个全局协程队列,这个全局队列里放的是多个处于可运行状态的G
。M
如果想要获取G
,就需要访问一个全局队列。同时,内核线程M
是可以同时存在多个的,因此访问时还需要考虑并发安全问题。因此这个全局队列有一把全局的大锁,每次访问都需要去获取这把大锁。
并发量小的时候还好,当并发量大了,这把大锁,就成为了性能瓶颈。
GMP模型是什么
基于没有什么是加一个中间层不能解决的思路,golang
在原有的GM
模型的基础上加入了一个调度器P
,可以简单理解为是在G
和M
中间加了个中间层。
于是就有了现在的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
运行G
,G
执行之后,M
会从P
获取下一个G
,不断重复下去。
为什么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
文章推荐:
i/o timeout,希望你不要踩到这个net/http包的坑
妙啊! 程序猿的第一本互联网黑话指南
程序员防猝死指南
别说了,一起在知识的海洋里呛水吧
关注公众号:【小白debug】
- END -
扫码关注公众号「网管叨bi叨」
给网管个星标,第一时间吸我的知识
会动的图解!GMP模型里为什么要有P?背后的原因让人暖心相关推荐
- 动图图解!GMP模型里为什么要有P?背后的原因让人暖心
文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://github.com/xiaobaiTech/g ...
- 动图图解!既然IP层会分片,为什么TCP层也还要分段?
文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://github.com/xiaobaiTech/g ...
- 会动的图解 (二) 怎么让goroutine跑一半就退出?
我们平时创建一个协程,跑一段逻辑,代码大概长这样. package mainimport ("fmt""time" ) func Foo() {fmt.Prin ...
- 通俗易懂的Go协程的引入及GMP模型简介
本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...
- 动图图解C语言选择排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- 再见 Go 面试官:GMP 模型,为什么要有 P?
大家好,我是煎鱼. 最近金三银四,是面试的季节.在我的 Go 读者交流群里出现了许多小伙伴在讨论自己面试过程中所遇到的一些 Go 面试题. 今天的主角,是 Go 面试的万能题 GMP 模型的延伸题(疑 ...
- Go语言线程与协程之间的关系之GMP模型
1. GMP模型 这里首先给出GMP模型的调度策略. 让大家有一个全局的认识更好 2. G (groutine) G就是goroutine的意思, 代表了一个协程. 每次go调用的时候,都会创建一个G ...
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- B站开源自研动漫超分辨率模型,助力动漫UGC视频高清化
点击上方"LiveVideoStack"关注我们 人类对于视频画质的升级是一个永无止尽的过程.从马赛克到高清画质,从720P到4K,视频平台正在不断提升画质,但目前各大视频平台的超 ...
最新文章
- linux ip rcv处理,linux ip选项处理(二)
- Python-数学篇之计算方法的目录:
- 模版设计模式概述和使用
- 阿里巴巴将赴NIPS 2017 3大事业部联袂展示AI全技能
- leetcode(34)在排序数组中查找元素的第一个和最后一个位置
- autotools入门笔记(二)——创建和使用静态库、动态库
- Ext js框架模拟Windows桌面菜单管理模板
- ORACLE数据库定时任务自动停止(broken)的原因分析及解决办法
- python-成都Python课程
- Sublime Text自定义插入当前时间的插件
- 9. 面向对象基础(下)
- 社保管理系统服务器异常,社保费客户端登录服务器异常
- 一分钟快速把一篇论文后面的参考文献全部下载下来
- 山东理工acm非专业-顺序结构
- 干货:饿了么交易系统的重构和实战
- 怪物之心无法触发_异度之刃2解锁稀有异刃力男支线怪物之心BOSS位置攻略
- deny后加to do还是doing_区别的to do和doing用法的小技巧
- JAVA-JDBC事务基础概念及测试方法
- Cisco 交换、路由和无线基础期末考试答案
- 计算机如何启动远程服务,Win7如何开启远程桌面服务