当前位置:网站首页>golang之GMP调度模型
golang之GMP调度模型
2022-08-02 14:10:00 【星星泡个饭】
一、简述go语言的GMP调度模型
G:一个G代表一个goroutine,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。
M:内核态线程,一个M代表了一个内核线程,等同于系统线程,所有的G都要放在M上才能运行。
P:逻辑处理器,可以承载若干个G,并且使这些G适时的与M对接,一个P代表了M所需的上下文环境。P的个数取决于设置的GOMAXPROCS, go新版本默认使用最大内核数,比如你有8核处理器,那么P的数量就是8
M的数量和P不一定匹配,可以设置很多M,M和P绑定后才可运行,多余的M处于休眠状态。
系统会通过调度器从全局队列找到G分配给空闲的M,P会选择一个M来运行,M和G的数量不等,P会有一个本地队列表示M未处理的G,M本身有一个正在处理的G,M每次处理完一个G就从本地队列里取一个G,并且更新P的schedtick字段,如果本地队列没有G,则从全局队列一次性取走G/P个数的G,如果全局队列里也没有,就从其他的P的本地队列取走一半。
二、golang 的协程:Goroutine 阻塞的话,是不是对应的M也会阻塞
分以下几种情况:
由于原子、互斥量或通道操作调用导致Goroutine 阻塞
该情况的G阻塞不会阻塞内核线程M,因此不会导致M的上下文切换 而至涉及到G的切换
由于网络请求文件IO 、 time.sleep、ticker计时器操作导致Goroutine 阻塞
该情况的G阻塞不会阻塞内核线程M,因此不会导致M的上下文切换 而至涉及到G的切换
由于调用阻塞的系统 导致的Goroutine 阻塞
这种情况会导致 M 阻塞,内核会进行M的切换,而与M关联的P不会等待M的阻塞,这意味着当前P下的所有G都无法执行,所以此时P会与当前M解除关联,转而关联到另一个内核线程M2,M2可能是新创建的内核线程,也可能时之前空闲的内核线程被唤醒来执行P的G。
当M进行 系统调用阻塞 结束的时候,这个G会尝试获取一个空闲的 P 执行,并放入到这个 P 的本地队列。如果获取不到 P,那么这个线程 M 变成休眠状态, 加入到空闲线程中,然后这个 G 会被放入全局队列中。
三、如何阻塞一个Goroutine
方法1:从一个不发送数据channel中接收数据
方法2:向不接收数据的channel中发送数据
方法3:从空的channel中接收数据
方法4:向空channel中发送数据
方法5:使用select
边栏推荐
- Win11系统找不到dll文件怎么修复
- 2021-10-14
- How to update Win11 sound card driver?Win11 sound card driver update method
- PyTorch(15)---模型保存和加载
- Win11怎么在右键菜单添加一键关机选项
- win10 system update error code 0x80244022 how to do
- PyTorch②---transforms结构及用法、常见的Transforms
- ARMv8虚拟化
- FP7195降压恒流PWM转模拟调光零压差大功率驱动方案原理图
- 使用npx -p @storybook/cli sb init安装失败,手把手搭建专属的storybook
猜你喜欢
FP6296锂电池升压 5V9V12V内置 MOS 大功率方案原理图
win10任务栏不合并图标如何设置
【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
基于无监督医学图像配准论文(1)
刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
基于GPT的隐变量表征解码结构
How to reinstall Win7 system with U disk?How to reinstall win7 using u disk?
FP6195耐压60V电流降压3.3V5V模块供电方案
Do Windows 10 computers need antivirus software installed?
Win11怎么在右键菜单添加一键关机选项
随机推荐
基于GPT的隐变量表征解码结构
Fast advanced TypeScript
How to reinstall Win7 system with U disk?How to reinstall win7 using u disk?
PyTorch(13)---优化器_随机梯度下降法
2020-02-06-快速搭建个人博客
Win10无法连接打印机怎么办?不能使用打印机的解决方法
arm ldr系列指令
Win7 encounters an error and cannot boot into the desktop normally, how to solve it?
单端K总线收发器DP9637兼容L9637
FP6296锂电池升压 5V9V12V内置 MOS 大功率方案原理图
对疫情期间量化策略表现的看法
用U盘怎么重装Win7系统?如何使用u盘重装系统win7?
PyTorch(14)---使用现有的模型及其修改
【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
PyTorch②---transforms结构及用法
PHY6222蓝牙5.2支持MESH组网M0内核超低功耗
LeetCode2 电话号码的字母组合
Win10 cannot directly use photo viewer to open the picture
2021-10-14
Win10 Settings screen out from lack of sleep?Win10 set the method that never sleep