【go之一】GMP模型

G: goroutine,协程。它包含了要执行的函数、栈、上下文等信息。Goroutine 的栈初始很小(通常 2KB)

M:machine,内核线程。它是真正在 CPU 上执行代码的实体。M 由操作系统调度。(上面图有点错误,M时机上是在 kernel space。

P:管理执行的上下文&G等。(用户线程,一个用户线程有一个P)

global queue: 实际上实在进程的堆上面放着。

本质就是一个生产消费模型。

  1. 生产过程:new一个goroutine了之后,优先放到runnext 或者 本地线程的p,如果p满了怎么办,放到global queue。如果global queue 满了咋办?
  2. 消费过程:P&M 1:1 绑定,如果P空了怎么办?优先从global 拿,其次从其他(随机的)的P中拿,或者从有新创建的G,那就拿这个新创建的G。 目标就是避免M饥饿。
  3. 如果M阻塞了咋办?比如一个G进行了IO,做了一次阻塞性的系统调用。
    1. M 暂时不能用了,需要跟P解绑定。P绑定一个新的M或者空闲的M。引申:P跟M绑定的规则是什么?怎么调度的?
    2. G 跟 M 一起阻塞着,系统调用完成了之后,G会先找原先的P,或者找其他的P,兜底就放到全局队列。

优势:

  1. 从上述模型来看:它的设计极致的压榨了cpu,只要M&P 绑定,P中稳定的有G,那就cpu会一直进行计算(消费)并且设计了一套规则,进行负载均衡,防止M饥饿。
  2. 协程非常的轻量,由于在用户态上下文切换,成本非常低。
相关推荐
名字还没想好☜7 小时前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
程序员爱钓鱼10 小时前
Go 输入输出详解
后端·面试·go
朦胧之1 天前
Go 项目设计
go
名字还没想好☜1 天前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
喵个咪1 天前
GoWind Shop 架构剖析:一个 REST 请求穿越三服务 BFF 的七环链路
vue.js·后端·go
喵个咪1 天前
GoWind Shop 安全设计:JWT 鉴权、Ent 行级隔离、防篡改审计与四个真实漏洞修复
vue.js·后端·go
喵个咪1 天前
GoWind Shop:一个 proto 文件如何生成后端、前端、文档、校验六路代码
vue.js·后端·go
喵个咪1 天前
GoWind Shop 出海实战:多语言商品内容怎么存、怎么录、怎么按 locale 取
vue.js·后端·go
小满zs2 天前
Go语言第八章(函数)
后端·go
stark张宇2 天前
实战Go高级特性:Context超时控制、defer资源回收与Channel通信的关键避坑点
后端·go