GMP模型学习笔记:概念、流程概述、设计机制及部分场景

news2024/11/17 5:44:23

前言

Go是并发而生的语言,其中则通过GMP模型来进行协程的分配与调度。本篇将记录自己学习GMP模型的笔记。

进程、线程、协程分配流程概述

计算机发展之初,是只有进程的。那时候是单进程时代,多个进程顺序执行,计算机也没有并发能力。

后来,多个进程/线程之间可以通过时间片轮转的方法进行调度。但是这样会导致大量的时间,耗费在时间片的切换上。
在这里插入图片描述

因此人们就又将线程分为了内核态和用户态,用户态线程就是协程。其二者可以通过1:1,N:1,N:M三种关系绑定。

关于用户态、内核态,先前的一篇学习笔记中曾记录过
https://blog.csdn.net/Ws_Te47/article/details/134790807

GMP模型属于M:N 多对多的模型,所谓GMP模型其实也更多就是这样一个协程调度器,用于将协程分配到线程之上。

题外话——在协程分配到线程之前,可能还会涉及到通过协程池进行协程复用,即任务分配给协程这一步。比如之前曾学习过的ants库就是这样一个协程池。(当时的习笔记)

GMP的前身——GM模型

在Go 1.1版本之前,采取的是GM模型而不上GMP模型。即直接将Goroutine分配给线程。
在这里插入图片描述

但是他存在以下问题:
1、创建、销毁、调度G都需要每个M获取锁,这就形成了激烈的锁竞争
2、M转移G会造成延迟和额外的系统负载。比如当G中包含创建新协程的时候,M创建了G’,为了继续执行G,需要把G’交给M’执行,也造成了很差的局部性,因为G’和G是相关的,最好放在M上执行,而不是其他M’
3、系统调用(CPU在M之间的切换)导致频繁的线程阻塞和取消阻塞操作增加了系统开销

因此退出了新的调度器,即GMP模型。

GMP模型概述

概念

GMP模型,G即Goroutine;M即machine 内核级线程;即processor处理器 其中包含了goroutine运行所需要的资源。

M0 是启动程序后的编号为 0 的主线程,这个 M 对应的实例会在全局变量 runtime.m0 中,不需要在 heap 上分配,M0 负责执行初始化操作和启动第一个 G, 在之后 M0 就和其他的 M 一样了。

G0 是每次启动一个 M 都会第一个创建的 gourtine,G0 仅用于负责调度的 G,G0 不指向任何可执行的函数,每个 M 都会有一个自己的 G0。在调度或系统调用时会使用 G0 的栈空间,全局变量的 G0 是 M0 的 G0。

流程

其基本流程如下:
新建一个Goroutine,分配给P的队列中去,随后M从P种获取Goroutine 并运行。
在分配时,会优先分配给P的本地队列。但如果本地队列已满,则会分配到全局队列中去。

M与P是绑定关系,获取运行时,会从P中弹出一个Goroutine给M。若本地P队列无法获取到,则会去全局队列获取。若全局队列也为空,则去其他线程中偷取G(即work stealing机制)

若M在执行G时发生阻塞,则会将这个M从P中剔除,再寻找空闲M或新建一个M绑定到这个P上。(即hand off机制)

当一个M调用结束后,这个G会寻找一个空闲的P执行,若找不到,则M变为休眠状态,G加入全局队列。

在这里插入图片描述
在这里插入图片描述

GMP的几个机制

复用线程:即work stealinghand off机制。

并行控制:即通过GOMAXPROCS设置最大P数量。

抢占:每一个goroutine最多占用CPU 10ms就被抢占。

全局G队列:相较于GM模型,其作用已被弱化,但还是有的。

GMP的部分场景

更多的见原文

协程中创建协程时

会放到当前使用M对应P的本地队列。

这个机制也就是解决了前面提到的GM模型的问题“局部性较差”。
在这里插入图片描述

P本地队列已满的情况再创建

会移动到全局队列,具体移动的是 新创建的那个 和 本地队列的前一半(防止饿死)。
在这里插入图片描述

参考文献

golang大杀器GMP模型

上一篇他基本是cv的这个,这篇又来自 刘丹冰Aceld 公众号

GMP 模型,为什么要有 P?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390582.html

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

相关文章

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么?Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接(默认)关…

在pycharm远程连接树莓派遇到的No files or folders found to process处理办法

在PyCharm中解决"No files or folders found to process"错误的另一个方法是通过Deployment中的Configuration选项。在PyCharm中,找到Tool并选择Deployment,然后点击Configuration。 在设置路径的过程中需要注意目标目录是相对的 在中 会识…

DNS从入门到精通

DNS从入门到精通 Dns从入门到精通 DNS从入门到精通一、DNS原理二、企业高速缓存dns的搭建三、DNS相关名词解释四、权威DNS搭建编辑子配置文件(主要写我们维护的域zone)开始解析 五、权威dns中的数据记录种类及应用编辑子配置文件(主要写我们维护的域zone…

微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

关键步骤介绍 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true&#xff0…

自定义C#类库(.dll文件)

环境配置 操作系统:Windows 10 开发工具:Visual Studio 2022 .Net桌面开发环境: 开发步骤 (一)创建C#类库项目 (二)配置项目名称和项目路径 (三)选择所使用的框架&a…

群晖NAS上安装部署开源工作流自动化工具n8n

一、开源工作流自动化工具n8n简介 n8n是它是一个与其他应用集成的应用程序,目标是自动化各应用之间的流程;利用 n8n 你可以方便地实现当 A 条件发生,触发 B 服务这样的自动工作流程。 n8n优点是:代码开源、可以自托管、下载安装方便、易于使用…

快速入门Java NIO(Not I/O)的网络通信框架--Netty

Netty 入门 了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1. 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid …

PLC绝对定位指令DDRVA往复运动(三菱FX系列简单状态机编程)

有关状态机的具体介绍,专栏有很多文章,大家可以通过下面的链接查看: https://rxxw-control.blog.csdn.net/article/details/125488089https://rxxw-control.blog.csdn.net/article/details/125488089三菱FX系列回原功能块介绍 https://rxxw-control.blog.csdn.net/article…

2024年【上海市安全员B证】模拟考试及上海市安全员B证复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 上海市安全员B证模拟考试是安全生产模拟考试一点通生成的,上海市安全员B证证模拟考试题库是根据上海市安全员B证最新版教材汇编出上海市安全员B证仿真模拟考试。2024年【上海市安全员B证】模拟考试及上海市…

网络安全(网络安全)—2024自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

TCP 的三次握手和四次挥手

Java 面试题 TCP 三次握手 第一次握手:客户端向服务端发送SYN包。报文中标志位SYN1,序列号seqx(x为随机整数)。此时客户端进入了 SYN_SEND 同步已发送状态。 第二次握手:服务端回复客户端SYNACK包。报文中标志位SYN1&…

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器(MDS)节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信,使用诸…

burp靶场——XXE注入

XML 外部实体 (XXE) 注入 1. 什么是xxe漏洞: https://portswigger.net/web-security/xxe#what-is-xml-external-entity-injection XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。…

无监督去噪的一个变迁(1)——N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络(BSNs,Blind Spot Networks)开创者3.1. N2V实际是如何训练的? 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

【Linux】权限详解

权限是什么呢? 通过一定条件,拦住一部分人,给另一部分人权利来访问某种资源 权限的本质: 权限与人有关:比如你要进你的学校是要看你是个人吗,重要的是看的是你是不是学校内学生,即你的角色 当然…

力扣精选算法100题——等于目标值的两个数or三数之和(双指针专题)

目录 🚩等于目标值的俩个数 第一步:了解题意 第二步:算法原理 第三步:代码实现 🚩三数之和 第一步:了解题意 第二步:算法原理 思路: ❗不漏: ❗去重: &#xf…

Midjourney Prompt基本结构

在 Midjourney 的官方介绍文档里,介绍了最简单的 Prompt 结构是这样的: 但我觉得上面那个 Prompt 过于简单了 😂 ,反而 Advanced Prompt 更适合学习: Image Prompts(选填) Prompt 分成三个部分…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用RequestBody…

游戏开发丨基于PyGlet的简易版Minecraft我的世界游戏

文章目录 写在前面我的世界PyGlet简介实验内容游戏按键程序设计引入文件 运行结果写在后面 写在前面 本期内容:基于PyGlet的简易版Minecraft我的世界游戏 实验环境: pycharmpyglet 项目下载地址:https://download.csdn.net/download/m0_6…

【CFP-专栏3】多领域SCI/EI快刊,1个月录用,12天见刊,1个月检索!

一、材料科学类SCI 【期刊概况】IF:3.0-4.0, JCR3区,中科院4区; 【大类学科】材料科学; 【检索情况】SCI在检; 【录用周期】2-3个月左右录用; 【接收领域】低温环境下新型生物降解材料的开发相关研究均可&#xf…