论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Golang GMP原理(1)
Golang GMP原理(1)
东湖之滨
金牌会员
|
2023-4-28 15:22:07
|
显示全部楼层
|
阅读模式
楼主
主题
979
|
帖子
979
|
积分
2941
Golang GMP原理(1)
概念梳理
线程
线程一般指内核级线程,核心如下:
操作系统的最小调度单元
创建 销毁 调度由内核完成,cpu要完成内核态与用户态的转换
可充分利用多核,实现并行
协程
协程线程对应
协程,又称为用户级线程,核心点如下:
与线程存在映射关系,为M:1
创建、销毁、调度在用户态完成,对内核透明,所以更轻
从属同一个内核级线程,无法并行;一个协程阻塞会导致从属同一线程的所有协程无法执行。
Goroutine
Goroutine是特殊的协程
与线程存在映射关系,为M:N
创建、销毁、调度在用户态完成,对内核透明,足够轻便
可利用多个线程实现并行
通过调度器实现和线程间的动态绑定和调度
栈空间可动态扩缩。
对比
模型弱依赖内核可并行可应对阻塞栈可动态扩缩线程×√√×协程√×××goroutine√√√√
GMP模型
g
g是goroutine,是对协程的抽象
g有自己的运行栈、状态、以及执行的任务函数(用户通过go func指定)
g需要绑定到p才能执行,在g的视角中,p是它的cpu
p
p是调度器,联系g与m
p的数量决定了g最大并行数量,可由用户通过GOMAXPROCS进行设定(超过CPU核数无意义)
m
m是machine 是go中线程的抽象
m不直接执行g,而是先和p绑定,由其实现代理
借由p的存在,m无需和g绑死,也无需记录g的状态信息,因此g在全生命周期中可实现跨m执行
gmp
m是线程的抽象 g是goroutine p'是调度器
m调度g前 需要和p绑定
全局有多个m和p 同时并行的g最大数量等于p的数量
g的存放队列有三类:P的本地队列;全局队列;和wait队列(图中未展示,为io阻塞就绪态goroutine队列)
m调度g时,优先取p本地队列,其次取全局队列,最后取wait队列;这样的好处是,取本地队列时,可以接近于无锁化,减少全局锁竞争;
为防止不同p的闲忙差异过大,设立work-stealing机制,本地队列为空的p可以尝试从其他p本地队列偷取一半的g补充到自身队列.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
东湖之滨
金牌会员
这个人很懒什么都没写!
楼主热帖
《HarmonyOS开发 - 小凌派-RK2206开发 ...
当我们在聊「开源大数据调度系统Taier ...
VMware虚拟机安装黑群晖7.1
从0到1实现一套CICD流程之CD
dotnet 6 为什么网络请求不跟随系统网 ...
ABP Framework 7.0 RC 新增功能简介 ...
大二C#实现酒店管理系统(C端展示、前 ...
MySQL视图
2023年2月苹果最新屏蔽系统更新描述文 ...
MySQL8.0 优化器介绍(二)
标签云
存储
服务器
浏览过的版块
数据仓库与分析
快速回复
返回顶部
返回列表