【Go】Go语言并发模型:MPG

Go 语言并发模型:MPG

Go 的并发模型主要由三个部分构成:

  • M (Machine)

    系统线程,用于实际执行任务。

  • P (Processor)

    逻辑处理器,负责管理和调度 goroutine。每个 P 拥有一个本地队列和关联的全局 G 队列。

  • G (Goroutine)

    Go 语言中的协程,是程序执行的基本单元。


M 与 P 的关系

  • 1:1 关系

    每个运行的任务对应的 M 必须关联一个 P,即 M 和 P 是一对一的关系。

  • 本地队列与全局队列

    • 每个 P 拥有自己的本地 G 队列,当本地队列满时,多余的 G 会被放入全局队列中。

系统调用和调度机制

Syscall 与阻塞处理

  1. 线程阻塞

    • 当某个 M(例如 M0)在执行 syscall 时陷入阻塞,它会释放所绑定的 P。
    • 该 P 会转交给一个空闲的 M(例如 M1)继续执行。
    • 如果没有空闲的 M,则会创建新的 M 来接管 P。
  2. 系统调用结束后的处理

    • 如果 M0 在系统调用结束后能获取到空闲的 P,则继续执行原来的 G(例如 G0)。
    • 如果没有空闲的 P,则 G0 会被放入全局队列,等待其它 P 调度,而 M0 则进入缓存池等待唤醒。
  • 全局队列 (runqueue)
    该队列用于调度各个 P 在运行完本地队列后的 G。

Work Stealing 机制

  • 调度策略
    • 当当前线程的本地队列中没有可运行的 G 时,会首先尝试从全局队列中获取任务。
    • 如果全局队列中也没有可用的 G,该线程将从其它线程绑定的 P 中"偷取"一半的 G 以保证负载均衡。

Sysmon 协程

  • 作用

    • sysmon 协程专门用于监控和管理协程状态,不需要 P 的支持即可执行。
  • 抢占策略

    • 在 Go 中,所有 goroutine 最多占用 CPU 时间为 10ms,超过这个时间的协程会被抢占,以防止某个 goroutine 独占 CPU,确保其他 goroutine 得到运行机会。

补充机制

  • 协程抢占

    • 通过协程抢占机制,Go 能够在长时间运行的协程中及时切换,确保系统中各个任务的公平调度。
  • 垃圾回收

    • Go 的垃圾回收机制会定期回收不再使用的内存,优化内存资源的利用。
相关推荐
Apifox2 分钟前
一分钟,让你的 API 文档支持 MCP 使用,Apifox 新功能上线!!!
前端·后端·mcp
万亿少女的梦16817 分钟前
基于Ebay拍卖网站成交价格的影响因素分析
java·开发语言·网络安全
鲁子狄26 分钟前
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案
java·后端
PfCoder26 分钟前
C# 匿名方法讲解
开发语言·c#
lingdian2328 分钟前
spring-security原理与应用系列:核心过滤器
java·后端·spring·安全管理·spring-security
鲁子狄38 分钟前
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现,自定义表头导出,并实现数据格式化转换与添加下拉框操作.
java·后端
华仔啊40 分钟前
宝塔Docker安装Jenkins打包详细步骤,小白也能轻松使用流水线部署微服务(超详细)
后端·jenkins
小冯的编程学习之路43 分钟前
【C++项目实战】:基于正倒排索引的Boost搜索引擎(1)
开发语言·c++·搜索引擎
是Dream呀1 小时前
TCN-Inception:基于时序卷积网络和Inception模块的传感器人体活动识别方法
后端·算法
aimmon1 小时前
Rust从入门到精通之进阶篇:19.Rust 生态系统
开发语言·后端·rust