【面试八股总结】GMP模型

GMP概念

  • G(Goroutine):代表Go协程,是参与调度与执行的最小单位。

        存储Goroutine执行栈信息、状态、以及任务函数等。G的数量无限制,理论上只受内存的影响。Goroutines 是并发执行的基本单位,相比于传统的线程,它们更轻量,消耗更少的资源,并由运行时系统调度。

  • M(Machine): Go 对操作系统线程的封装,可以看作操作系统内核线程。

        负责将 Goroutines 映射到真正的操作系统线程上。在运行时系统中,有一个全局的M列表,每个 M 负责调度 Goroutines。当⼀个 Goroutine 需要执行时,它会被分配给一个M,并在该 M 的线程上运行。M 的数量可以根据系统的负载动态调整。

  • P(Processor):处理器,用于执行Goroutines的上下文。

        包含了运行goroutine的资源,如果线程想运行Goroutine,必须先获取P,P中还包含了可运行的G队列。

GMP 模型的工作原理:

  • 当一个 Goroutine 被创建时,它会被放入一个 P 的本地队列。
  • 当 P 的本地队列满了,或者某个 Goroutine 长时间没有被调度执行时,P 会尝试从全局队列中获取 Goroutine。
  • 如果全局队列也为空,P 会从其他 P 的本地队列中偷取一些 Goroutines,以保证尽可能多地利用所有的处理器。
  • M 的数量决定了同时并发执行的 Goroutine 数目。如果某个 M 阻塞(比如在系统调用中),它的工作会被其他 M 接管。

    在Go中,线程是运行goroutine的实体,调度器的功能是把可运行的goroutine分配到工作线程上。Goroutine调度器和OS调度器是通过M结合起来的,每个M都代表了一个内核线程,OS调度器负责把内核线程分配到CPU的核上执行。

GMP模型优点 :

  • 复用线程:避免频繁的创建销毁线程
    • work stealing策略:当本线程绑定的P本地队列中没有可以运行的G时,会尝试从其他P偷G来运行,而不是销毁本线程
    • hand off机制:当本线程因为执行某个G发生系统调阻塞时,会将绑定的P释放,将P转移给其他空闲的M去执行
  • 多核并行:GOMAXPROCS设置P的数量,因此最多可有GOMAXPROCS个线程分布在多个cpu上同时执行
  • 抢占:在其他协程中要等待一个协程主动让出cpu才会让下一个协程执行,而go中一个goroutine最多占用 cpu 10ms,防止其他goroutine被饿死
  • 全局队列:当work stealing策略失效时,会从全局队列中获取G来执行

Goroutine被挂起情况:

调度器重新发起调度更换P执行时,会将Goroutine挂起;

  • 在channel堵塞的时候;
  • 在垃圾回收的时候;
  • sleep休眠;
  • 锁等待;
  • 抢占;
  • IO阻塞

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

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

相关文章

Redis集群知识及实战

1. 为什么使用集群 在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢&…

sourcetree配置ssh连接gitee

使用PuttyGen.exe生成的公钥私钥格式和git文档方法生成的不一样, SSH 公钥设置 | Gitee 帮助中心 gitee方法生成的公钥类似: ssh-ed25519 AAAA***5B Gitee SSH Key PuttyGen.exe生成的: 公钥 ---- BEGIN SSH2 PUBLIC KEY ---- Comment:…

【新手/小白教程】打开一个vue项目的前置准备,nvm安装指定版本node

目录 一、前言二、nvmnvm介绍nvm下载与安装1. 官网下载 nvm 包2. 安装 nvm-setup.exe3. 配置路径和下载镜像4. 检查nvm是否安装完成5. 错误情况 三、nodenode版本查看node命令 一、前言 在换新电脑的时候总是需要把所有东西重新安装配置,这篇用来记录一下打开一个v…

【云原生监控】Prometheus之PushGateway

Prometheus之PushGateway 文章目录 Prometheus之PushGateway介绍作用资源列表基础环境一、部署PushGateway1.1、下载软件包1.2、解压软件包1.3、编辑配置systemctl启动文件1.4、创建日志目录1.5、加载并启动1.6、监控端口1.7、访问PushGateway 二、 配置Prometheus抓取PushGate…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为: 接下来我们将对其中较重要的部分进行介绍。 4位版本:这里的四位版本只有两个取值 分别为IPv4和IPv6,这两个额分别为不同的IP协议,但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(上)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案…

Java语言程序设计基础篇_编程练习题*18.28 (非递归目录大小)

目录 题目:*18.28 (非递归目录大小) 习题思路 代码示例 输出结果 题目:*18.28 (非递归目录大小) 不使用递归改写程序清单18-7 习题思路 ( getSize方法) 创建一个变量表示总共的大小。传入路径,创建File文件。创建A…

【Elasticsearch】-图片向量化存储

需要结合深度学习模型 1、pom依赖 注意结尾的webp-imageio 包&#xff0c;用于解决ImageIO.read读取部分图片返回为null的问题 <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</versio…

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

移动技术开发:登录注册界面

1 实验名称 登录注册界面 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayoutxmlns:android"http://schemas.android.com/apk/…

在Windows 7上安装Redis

1、下载Redis安装包‌&#xff1a; 首先&#xff0c;从Redis的官方网站或可信的第三方资源下载Redis的Windows版本安装包。确保下载与你的Windows 7系统兼容的版本。 2、解压安装包‌&#xff1a; 将下载的Redis安装包解压到你选择的目录&#xff0c;例如F:\Redis\redis-win…

关于文件操作

1. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久…

栈和队列的算法题目(C语言)

1. 括号匹配问题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 利用栈后入先出的特性解题 1.判断字符串是否为空 为空返回 2.创建栈&#xff0c;遍历字符串 第一个字符是左括号的情况&#xff1a;入栈->继续遍历下一个字符 第一个字符是右括号的情况&#xf…

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形&#xff0c;捕捉右侧圆形焦点

【算法专题】穷举vs暴搜vs深搜vs回溯vs剪枝

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

4款AI生成PPT工具推荐,提升工作效率

在如今的工作环境中&#xff0c;PPT制作是许多技术人员不可避免的任务&#xff0c;尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展&#xff0c;使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具&#xff0c;帮…

强化学习——马尔可夫决策过程(MDP)【附 python 代码】

一、马尔可夫过程 过程介绍随机过程在某时刻 t 的状态 S t S_t St​ 通常取决于 t 时刻之前的状态。状态 S t 1 S_{t1} St1​ 的概率表示为&#xff1a; P ( S t 1 ∣ S 1 , . . . , S t ) P(S_{t1}|S_1,...,S_t) P(St1​∣S1​,...,St​)马尔可夫过程某时刻 t 的状态只取…

JAVA-集合相关

HashMap如何解决哈希冲突的&#xff1f; 计算hash值&#xff0c;基于hashCode计算冲突之后&#xff0c;先是使用链式寻址法当链表长度大于8&#xff0c;且hash表的容量大于60的时候&#xff0c;再添加元素则转化成红黑树 为什么计算hash值是&#xff0c;是将hash地址的值右移1…

大数据Flink(一百一十八):Flink SQL水印操作(Watermark)

文章目录 Flink SQL水印操作&#xff08;Watermark&#xff09; 一、为什么要有WaterMark 二、​​​​​​​​​​​​​​Watermark解决的问题 三、​​​​​​​​​​​​​​代码演示 Flink SQL水印操作&#xff08;Watermark&#xff09; 一、​​​​​​​为什么…

43.常用C++编译器推荐——《跟老吕学C++》

43.常用C编译器推荐——《跟老吕学C》 常用C编译器推荐一、C编译器介绍1. GCC (GNU Compiler Collection)2. Clang2.1 Clang的特点2.2 Clang的应用场景2.3 Clang与GCC的比较 3. Microsoft Visual C (MSVC)MSVC的特点MSVC的使用场景MSVC与其他编译器的比较 4. Intel C Compiler4…