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

什么是GO语言里面的GMP调度模型?

https://www.yuque.com/aceld/golang/srxd6d
[图片]

GMP是Go语言的协程调度模型,G代表goroutine,M代表内核线程,P代表逻辑处理器,P中包含本地运行的G队列,G通过P绑定到M上才能运行。
注:协程会给你上下文切换保存了那些寄存器?发生调度的时机?

  • rsp:指向函数调用的栈顶。
  • rip:指向程序要执行的下一条指令地址。
  • rbp:存储函数栈帧的起始地址。
    重点:GMP的调度流程
    调度时机
  • 等待读取channel或者是写入无缓冲的channel
  • 使用time.Sleep睡眠
  • 等待互斥量执行完毕释放的过程
  • 发生了系统调用,如文件读写、网络请求等
    调度流程
    协程在刚创建的时候,会优先加入到当前P的本地队列中,去等待调度,如果这个P队列满了,会将一半的G和这个新创建的G打乱顺序一起放入全局队列中。每个M都有一个特殊的协程g0负责调度工作,每一轮的调度,M都是优先去执行与它绑定的P的本地队列上的G,如果本地队列中没有G,就会从全局队列获取,若全局队列也没有,就会从其它P的队列中偷取一半的G,如果这也没有获取到的话,就会让M进入自旋状态。
    以上就是GMP的调度流程,但是可能会出现几个问题:
    1、如果说P本地队列一直有G呢?那么全局队列怎么办?
    不用担心,Go的调度器每执行61次之后,就会优先从全局队列中获取一个G放到当前P本地队列中。
    调度方式
    分为两种,协作式和抢占式。
    在Go1.14之前,是协作式抢占的,Go会启动一个线程,一直运行着sysmon函数,当sysmon发现M已运行同一个G10ms以上时,它会将G的内部参数preempt设置为true,当G进行函数调用的时候,会判断preempt,如果为true,则将这个G和M分离,并将G放入全局队列中。(注意:发生函数调用之后,才能判断preempt)
    在Go1.14之后,是基于信号的异步抢占。sysmon会检测运行了10ms以上的G,然后,sysmon向运行G的M发送信号,Go的信号处理程序会调用M上一个叫做gsignal 的goroutine来处理该信号,若gsignal看到抢占信号,就停止正在运行的G,并将G放入到全局队列中。这一种基于信号量的抢占可以防止类似死循环的这种,没有发生函数调用的goroutine一直占用cpu导致程序阻塞。
    GMP能不能去掉P层?会怎么样呢?M和P的数量?
    不能去掉P层。因为早期的就是GM模型,没有P的本地队列,那么每次所有的M都要去全局队列中获取可用的G,这样会造成大量的锁竞争问题。而有了P层之后,大幅度减轻了对全局队列的直接依赖,让锁竞争问题大大减少,并且在GMP中也实现了work stealing算法,若P的本地队列为空,就会从全局队列或其它的P本地队列中来偷取可用的G来运行,提高了资源利用率,所以不能去掉P层。
    进程、线程、协程?
  • 进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位,进程独占一个虚拟内存空间,而进程里的线程共享一个进程虚拟内存空间。
http://www.dtcms.com/a/438203.html

相关文章:

  • Traffic Filtering 流过滤 概念及题目
  • 198种组合算法+优化BiGRU双向门控循环单元+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
  • 兼职开发网站开发建设网站需要学什么
  • SQLite 简介
  • TypeScript 中的 JSX 详解
  • Codesys如何读取轴的当前控制模式
  • 高性能网站建设指南 京东模拟网站开发
  • 一元购网站建设教育类网站策划书
  • 2025 AI 落地全景:从技术热潮到产业重构
  • 解析动态数据:如何抓取 JavaScript 加载的 AJAX 内容
  • 聚焦技术落地,展现 AI 重构产业的实践路径。
  • 番禺网站(建设信科网络)小卖部做网站
  • 【氮化镓】P-GaN:提高高温栅极寿命的解决方案
  • 商洛做网站多少钱珠海网站制作哪家便宜
  • 唐山中企动力做网站用php做电子商务网站
  • 05_Pandas数据结构
  • OSPF协议详解3:网络类型、SPF算法、路由选择与特殊区域
  • 10.3总结
  • 算法比赛中的浮点数精度陷阱:从一个货币分解问题说起
  • 昆明手机网站开发不到网站是为什么
  • 反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
  • 爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
  • LeetCode每日一题——判断能否形成等差数列
  • springboot整合sa-token报未能获取有效的上下文处理器
  • 和别人做网站接单赚钱企业网站开发技术期末试题
  • AI-调查研究-93-具身智能 机器人仿真工具大全:从Gazebo到Isaac Sim的全面对比 六大仿真平台
  • 【计算机视觉】霍夫变换检测
  • 【Java核心技术/基础】25道Java核心技术基础面试题及答案
  • AI伦理困局:算法时代的公平与治理之道
  • 网站及app开发招聘榆中县城乡建设局网站