当前位置: 首页 > news >正文

【面试八股总结】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阻塞

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 小程序开发设计-第一个小程序:创建小程序项目④
  • curl格式化json之jq工具?
  • Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)
  • 6--SpringBootWeb案例(详解)
  • springboot实战学习笔记(2)
  • vue项目中,属性表头默认为横向排列,却没有纵向排列的组件或相关属性,如何将其纵向排列?
  • vivado中选中bd文件后generate output product是什么用,create HDL wrapper是什么用
  • Java | Leetcode Java题解之第414题第三大的数
  • 检查和测绘室内防撞无人机技术详解
  • 828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~
  • Qt 模型视图(四):代理类QAbstractItemDelegate
  • 3D GS 测试自己的数据
  • 深入剖析:C++类对象的内存布局与优化
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • Stable Diffusion Fooocus批量绘图脚本
  • axios 和 cookie 的那些事
  • css属性的继承、初识值、计算值、当前值、应用值
  •  D - 粉碎叛乱F - 其他起义
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Js基础知识(四) - js运行原理与机制
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React16时代,该用什么姿势写 React ?
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue-cli在webpack的配置文件探究
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 构建二叉树进行数值数组的去重及优化
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端攻城师
  • 前端面试总结(at, md)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据科学 第 3 章 11 字符串处理
  • 问题之ssh中Host key verification failed的解决
  • 物联网链路协议
  • 2017年360最后一道编程题
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 数据可视化之下发图实践
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​queue --- 一个同步的队列类​
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​数据结构之初始二叉树(3)
  • #pragam once 和 #ifndef 预编译头
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)无线电失控保护(二)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)linux使用docker容器运行mysql
  • (回溯) LeetCode 131. 分割回文串
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (万字长文)Spring的核心知识尽揽其中
  • (转)http协议