go语言的GMP(基础)

news2025/6/5 16:28:24

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.coloradmin.cn/o/2397369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电路图识图基础知识-高、低压供配电系统电气系统的继电自动装置(十三)

电气系统的继电自动装置 在供电系统中为保证系统的可靠性,保证重要负荷的不间断供电,常采用自动重合闸装置和备用电源自动投入装置。 1 自动重合闸装置 供配电系统多年运行实践表明,架空线路发生的故障多属于暂时性故障,如雷击…

Qt实现的水波进度条和温度进度条

一.效果 二.原理 1.水波 要模拟波浪,就要首先画出一条波浪线,正弦余弦曲线就很适合。 y=A*sin(ω*x+φ)+k y=A*cos(ω*x+φ)+k 这是正弦余弦曲线的公式,要想实现水波效果,那需要两条曲线,一条曲线的波峰对着另外一条曲线的波谷,要实现这样的曲线效果,只有让正弦曲线前移…

WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM

目录 一、适配方案 二、VM布局 ​编辑 三、vh布局 四、案例—酷我音乐 一、适配方案 二、VM布局 三、vh布局 四、案例—酷我音乐

【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事

好的,下面是Zephyr 系列第 3 篇:聚焦 多线程与调度机制的实践应用,继续面向你这样的 Ubuntu + 真板实战开发者,代码清晰、讲解通俗、结构规范,符合 CSDN 高质量博客标准。 🧠关键词:Zephyr、线程调度、k_thread、k_sleep、RTOS、BluePill 📌适合人群:想从裸机开发进…

Kotlin-特殊类型

文章目录 数据类型枚举类型匿名类和伴生对象单例类伴生对象 数据类型 声明一个数据类非常简单: //在class前面添加data关键字表示为一个数据类 data class Student(var name: String, var age: Int)数据类声明后,编译器会根据主构造函数中声明的所有属性自动为其生成以下函数…

nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

这是题目&#xff0c;下载后得到一个python文件,打开 解读代码&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;从列表中取数字同时高4位向右位…

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡 3.1 系统核心目录结构 Discuz! X3.5采用模块化设计&#xff0c;主要目录结构如下&#xff1a; discuz_root/ ├─ api/ // API接口目录 ├─ config/ …

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 一、前言 图(1-1) HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。 其核心能力包括:扫描合同、票据、会议记录并保存为 PDF 分享。拍摄课堂 PPT、书籍章…

Python_day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 关于 Dataset 从谷歌图片中抓取了 1000 多张猫和狗的图片。问题陈述是构建一个模型&#xff0c;该模型可以尽可能准确地在图像…

STM32CubeDAC及DMA配置

STM32CubeDAC及DMA配置 一&#xff0c;问题1二&#xff0c;解决11&#xff0c;宏观思路CubeMX配置2&#xff0c;HAL_TIM_Base_Start(&htim6) 的作用1&#xff0c;作用1&#xff1a;使能TIM6的时钟并让它开始计数2&#xff0c;作用2&#xff1a;当 TIM6 溢出时&#xff0c;会…

行业案例 | OPPO借助Azure AI Speech国际服务实现音频文件智能转录

OPPO是全球领先的智能终端与移动互联网服务提供商&#xff0c;业务覆盖50余国&#xff0c;通过超40万销售网点和2500个服务中心与全球用户共享科技。作为软硬服一体化科技公司&#xff0c;OPPO以ColorOS为核心优化软件平台&#xff0c;为4.4亿月活用户打造智能操作系统&#xf…

基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)

摘 要 本文介绍如何利用Dlib面部特征点检测和OpenCV图像处理技术&#xff0c;通过Python实现面部特征的精准调整。我们将以改变眼间距为例&#xff0c;演示包括地标检测、三角剖分变形等关键技术&#xff0c;该方法可扩展至嘴唇、眉毛等面部特征的调整。 技术栈 Python 3.8 …

spring-boot接入websocket教程以及常见问题解决

我们使用spring-boot接入websocket有三种方式&#xff1a;使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint&#xff0c;本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…

迈向分布式智能:解析MCP到A2A的通信范式迁移

智能体与外部世界的桥梁之言&#xff1a; 在深入探讨智能体之间的协作机制之前&#xff0c;我们有必要先厘清一个更基础的问题&#xff1a;**单个智能体如何与外部世界建立连接&#xff1f;** 这就引出了我们此前介绍过的 **MCP&#xff08;Model Context Protocol&…

深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法

【1】引言 pytorch对张量的基本运算和线性代数课堂的教学有一些区别&#xff0c;至少存在hadamard积、点积和矩阵乘法三种截然不同的计算方法。 【2】hadamard积 hadamard积是元素对位相乘&#xff0c;用“*”连接张量&#xff0c;代码&#xff1a; # 导入包 import torch …

FFmpeg移植教程(linux平台)

目录 第三方源码编译三部曲关于 configure 的说明 FFmpeg 移植流程获取源码方法一&#xff1a;git 远程克隆方法二&#xff1a;官网下载压缩包解压 配置安装 第三方源码编译三部曲 Linux平台下有许多开源的第三方库和服务&#xff0c;这些开源代码一般都符合GNU-autotools编码…

Mybatis:灵活掌控SQL艺术

在前面的文章中&#xff0c;小编分享了spring中相关的知识&#xff0c;但是没有分享到&#xff0c;如何去更高效操作数据库。 操作数据库传统的方法就是通过JDBC来进行操作。 这个传统方法使用上可谓是够麻烦的 1.首先创建一个数据源对象 2.设置该数据源的属性&#xff08;…

2025.05.28【Choropleth】群体进化学专用图:区域数据可视化

Load geospatial data Start by loading your geospatial data in R, and build a basic plot. Data from the package The cartography comes with a set of geospatial data included. Learn how to use it to build a choropleth map. 文章目录 Load geospatial dataData …

【春秋云镜】CVE-2022-26965 靶场writeup

知识点 网站的主题或者模块位置一般是可以上传文件的&#xff0c;不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中&#xff0c;而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了&#xff0…

JSP、HTML和Tomcat

9x9上三角乘法表 乘法表的实现 <% page contentType"text/html;charsetUTF-8" language"java" %> <!DOCTYPE html> <html> <head><title>99 上三角乘法表</title><style>body {font-family: monospace;padding…