go语言的GMP(基础)

article/2025/8/3 16:29:51

1.概念梳理

1.1线程

通常语义中的线程,指的是内核级线程,核心点如下:

(1)是操作系统最小调度单元;

(2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切换;

(3)可充分利用多核,实现并行.

1.2协程

在这里插入图片描述

协程是一个用户级线程

(1)与线程存在映射关系,为 M:1

(2)创建,销毁,调用全在用户态进行,对内核透明,所以更轻

(3)从属同一个内核级的线程,无法实现真正的并行;一个协程的阻塞,会导致同属同一个线程的所有协程无法执行。

1.3 Goroutine

在这里插入图片描述

协程是一个通用概念,可以用于描述任何语言或框架中的轻量级线程。Goroutine 则是 Go 语言中实现协程的具体方式。

Goroutine,经Golang优化后的特殊“协程”,核心点如下:

(1)与线程存在映射关系,为M:N;

(2)创建,销毁,调度在用户态完成,对内核态透明,足够轻便;

(3)可利用多个线程,实现并行;

(4)通过调度器(MPG)的斡旋,实现和线程间的动态绑定和灵活调度;

(5)每个Goroutine都有着自己的栈空间,栈空间大小可动态扩缩,因地制宜;

在这里插入图片描述

综上,goroutine 可说是博采众长之物.
实际上,“灵活调度” 一词概括得实在过于简要,Golang 在调度 goroutine 时,针对“如何减少加锁行为”,“如何避免资源不均”等问题都给出了精彩的解决方案,这一切都得益于经典的 “gmp” 模型。

2 gmp 模型

gmp = goroutine + machine + processor (+ 一套有机组合的机制),下面先单独拆出每个组件进行介绍,最后再总览全局,对 gmp 进行总述.

2.1 g

(1)g 即goroutine ,是golang中对协程的抽象;

(2)g有自己的运行栈、状态、以及执行任务函数(用户通过go func指定)

(3)g需要绑定到p才能执行,在g的视角,p就是它的CPU。

2.2 p

(1)p是processor,是golang中的调度器工作单元;

(2)p是gmp的中枢,借助p承上启下,实现g和m之间的动态有机结合;

(3)对g而言,p是其cpu, g只有被p调度,才得以执行;

(4)对m而言,p是其执行代理, 为其提供必要信息的同时(可执行的g,内存分配情况等),并隐藏了繁杂的调度细节;

(5)p的数量决定了g最大并行数量,可由用户通过GOMAXPROCS进行设定(超过CPU核数时无意义)。

2.3 m

(1)m即machine,是golang中对线程的抽象;

(2)m不直接执行g,而是先和p绑定,由其实现代理;

(3)借由p的存在,m无需和g绑死,也无需记录g的状态信息,因此g在生命周期中可以跨m执行。

2.4 gmp

在这里插入图片描述

GMP宏观模型如上图所示,下面对其要点和细节进行逐一介绍:

(1)M是线程的抽象;G是goroutine;P是承上启下的调度器;

  • M 代表操作系统线程,也就是 Go 调度器中的机器线程。它执行任务(即 Goroutine)。
  • G 是 Go 中的轻量级线程,即 Goroutine,是并发执行的基本单位。每个 G 执行一个任务,多个 Goroutine 可以同时运行。
  • P 是调度器的核心部分,它负责管理和调度 Goroutine 的执行。每个 P 上有一个本地队列,存放待执行的 GoroutineP 会将这些 Goroutine 分配给空闲的 M 来执行。

(2)M调度G前,需要和P绑定

  • M 必须与 P 绑定才能执行任务。P 负责管理待执行的 Goroutine(即将 G 加入到 P 的队列),而 M 则通过 P 获取需要执行的任务并执行它们。MP 的绑定保证了 Goroutine 能够按需被调度执行。

(3)全局有多个M和多个P,但同时并行的G的最大数量等于P的数量;

  • GOMAXPROCS 决定了 Go 程序的并行度,即最大的并行执行 Goroutine 数量。由于每个 P 对应一个执行单元,同时并行执行的 Goroutine 数量是由 P 的数量决定的。因此,最多能并行执行的 Goroutine 数量等于 P 的数量,而不是 MG 的数量

(4)G的存放队列有三类:P的本地队列;全局队列;和wait队列(图中未展示,为io阻塞就绪态goroutine队列);

Goroutine 的调度依赖于三个主要队列:

  • P 本地队列:每个 P 会有一个本地队列,用来存放当前 P 管理的 Goroutine。当 M 执行时,会首先从本地队列中取任务执行。
  • 全局队列:所有 P 的共享队列,用来存放被挂起的 Goroutine。如果某个 P 的本地队列为空,它会从全局队列中获取任务。
  • Wait 队列:存储因 I/O 操作等原因处于阻塞状态的 Goroutine。它们会等待某些条件满足后才能重新被调度。

(5)M调度G时,优先取P本地队列,其次取全局队列,最后取wait队列;这样的好处是,取本地队列时,可以接近于无锁化,减少全局锁竞争;

这是调度优化的一个重要方面:

  • P 本地队列:首先,M 会从 P 的本地队列中获取 Goroutine,因为这是最快的方式,几乎没有锁的竞争,因此能够更高效地调度任务。
  • 全局队列:当 P 本地队列为空时,M 会尝试从全局队列中获取任务。全局队列是多 P 共享的,因此存在一定的锁竞争。
  • Wait 队列:最后,如果全局队列也没有任务,M 会从 wait 队列中获取阻塞的 Goroutine,当 I/O 等操作完成后再调度它们。

(6)为防止不同P的闲忙差异过大,设立work-stealing机制,本地队列为空的P可以尝试从其他P本地队列偷取一半的G补充到自身队列。

Go 的调度器采用 work-stealing(工作窃取)机制来减少不同 P 闲忙差异:

  • 当某个 P 的本地队列为空时,它会尝试从其他 P 的本地队列中“偷取”一部分 Goroutine 来执行。这有助于平衡负载,使得各个 P 不会因为队列为空而闲置,从而提高程序的整体并行性。

http://www.hkcw.cn/article/UDBBrYxUlw.shtml

相关文章

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群,容器信息: 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群: 文件内容&…

RTMP播放器谁更强?深入解析SmartPlayer与VLC、PotPlayer等方案的技术差异

在视频直播、安防监控、边缘计算、AI视觉识别等场景中,低延迟、高稳定的RTMP播放器SDK 是关键技术模块。虽然市面上存在VLC、PotPlayer等“看起来能播”的播放器,但真正能适用于生产环境,支持工程集成、多平台、复杂网络、实时反馈的专业RTMP…

DelphiXe12创建DataSnap REST Application

服务端:该类型应用可直接部署EXE导云端,指定单页直接写好函数,即可导出。同时自动提供网页版的API文档,并可在线测试写好的接口。也可以向其他语言提供接口。 客户端:可生成调用服务端生成的API接口,无效编…

跨平台猫咪桌宠 BongoCat v0.4.0 绿色版

—————【下 载 地 址】——————— 【​本章下载一】:https://pan.xunlei.com/s/VORWH1a7lPhdwvon6DJgKvrNA1?pwdcw2h# 【​本章下载二】:https://pan.quark.cn/s/c3ac86f4e296 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…

2023ICPC杭州题解

文章目录 M. V图(签到)J. 神秘树(交互)G. 控制贪吃蛇(最短路)D. 运算符优先级(构造)H. 甜蜜的修噶 II(概率)B. 节日装饰(bitset根号分治)F. Top Cluster(LCA动态维护树的直径) 题目链接 M. V图(签到) int cmp(int x1,int y1,int x2,int y2){int xx1*y2,yx2*y1;if(x>y)return…

图文详解Java并发面试题

文章目录 1、并发与并行2、线程安全3、线程、进程、协程4、线程间通信5、线程创建方式6、8G内存创建的线程数7、普通Java程序含有的线程8、start()、run()9、线程调度、6种状态、强制停止线程、上下文切换10、守护线程、用户线程11、 volatile 、synchronized12、sleep() 、 wa…

文档核心结构优化(程序C++...)

文档核心结构优化 一、文档核心结构优化二、C关键特性详解框架2.1 从C到C的范式迁移 三、深度代码解析模板3.1 现代C特性分层解析 四、C vs C 关键差异矩阵五、交互式文档设计策略5.1 三维学习路径5.2 代码缺陷互动区 六、现代C特性演进图七、性能优化可视化呈现(深…

Python打卡训练营Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as tr…

Redis 架构设计

找实习中。。。学项目学到redis,又偶然看了个拓展的。是得物的Redis设计,拿出来分享了。 文章地址,https://mp.weixin.qq.com/s/dnlxCXgAxHsfyVNYTDsewA 话说,架构师就是干这种工作的吗? 插曲 才知道这么念&#xff…

振动力学:无阻尼单自由度系统

单自由度振动系统是最简单的一类振动系统,仅用一个坐标就可描述。从力学角度分析,一个实际的振动系统可由三个元件组成:惯性质量、弹性、阻尼,,它们分别描述系统的惯性、弹性、能耗机制。惯性元件是运动的实体,弹性元件提供振动回复力,阻尼元件在振动过程中消耗或吸收外界…

LangChain-结合智谱AI大模型实现自定义tools应用实例

准备: 1.可供调用的实时查询天气的接口: 百度天气接口:https://lbsyun.baidu.com/faq/api?title=webapi/weather/base(没有可以去注册用户实名认证后即可免费使用) 可以使用接口工具ApiPost调用,验证接口是否正常 2.一个csv文件,文件内容中包含各个省市区的行政编码 …

DAY 34 超大力王爱学Python

CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作self.fc1(x) ps:在训练过程中可以在命…

BLIP-2

目录 摘要 Abstract BLIP-2 模型框架 预训练策略 模型优势 应用场景 实验 代码 总结 摘要 BLIP-2 是一种基于冻结的图像编码器和大型语言模型的高效视觉语言预训练模型,由 Salesforce 研究团队提出。它在 BLIP 的基础上进一步优化,通过轻量级…

通过WiFi无线连接小米手机摄像头到电脑的方法

通过WiFi无线连接小米手机摄像头到电脑的方法 以下是基于Scrcpy和DroidCam两种工具的无线连接方案,需提前完成开发者模式与USB调试的开启(参考原教程步骤): 方法一:Scrcpy无线投屏(无需手机端安装&#xf…

8088 单板机 NMI 中断程序示例 (脱离 DOS 环境)

求组DeepSeek给的将要进行的8088单板机NMI中断编程示例。 /* nmidemo.c - 8088 单板机 NMI 中断演示程序 */ /* 脱离 DOS 环境,直接运行在裸机上 */ /* 使用 Digital Mars C 编译器,TINY 模式编译 *//* 硬件配置假设:- 8088 CPU 4.77MHz- 8255 PPI (可…

详解鸿蒙开发如何上传三方库到ohpm仓库

前两天幽蓝君在ohpm仓库上传了自己的第一个三方库,完整体验了一下ohpm的上传流程,感觉还是比较繁琐的,所以把上传流程和一些注意事项分享给大家。 先介绍一下怎么开发一个三方库,在项目名称右键,新建Module&#xff0…

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL: 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集,失败为false; 成功返回结果:SQL指令没有错误,但是查询结果…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

邂逅Webpack和打包过程

前端开发方向 目前国内的前端开发 主要使用Vue和React 一般你写个项目,过程就是:npm/yarn --> webpack架构 --> Vue/React框架 而针对Vue和React都有脚手架的,脚手架是基于webpack搭建的 你写.jsx或者ts之类的浏览器是不认识的&…

计算机网络第1章(下):网络性能指标与分层模型全面解析

目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…