GMP调度模型

436 字
2 分钟
GMP调度模型

GMP简介#

GMP是Go(1.1之后)运行时为了实现高并发、高性能而设计的一套核心调度模型。分别的含义如下:

  • G(goroutine):也就是go中的协程,利用go func()来实现。
  • M(machine):操作系统的内核级线程。
  • P(processor):逻辑处理器。

这套模型的核心目标,是将用户态的轻量级协程(G)高效地映射到操作系统地内核线程(M)上执行,同时通过引入逻辑处理器(P)来解决多核环境下的资源竞争和负载均衡问题。

G#

G就是Goroutine,它是Go并发的基本单元,本质是一个轻量级的协程。

特点#

  • 初始栈很小,只有2KB,创建的成本极低并且可以根据需要动态伸缩。所以一个Go程序可以轻松运行百万个Goroutine。
  • 切换成本极低(微秒级)。
  • 状态:
    • 就绪(Runnable)
    • 运行(Running)
    • 等待(Waiting,如I/O阻塞)

M#

P#

GMP调度流程#

Note

整个调度过程可以概括为M找P,P给G。

  1. 创建G:当使用go func()启动一个协程时,新的G会优先被放入当前P的本地队列中。如果本地队列满了,才会放入全局队列。
  2. M绑定P:操作系统线程M启动后,会尝试获取一个空闲的P。只有拿到P,M才能开始工作。
  3. 执行循环:
  • M绑定P后,会从P的本地队列中取出G来执行。这是最高效的路径,因为减少了锁竞争。
  • 如果本地队列空了,会尝试从全局队列中获取G,或者通过网络轮询器检查是否有就绪的网络IO事件。

内容 被隐藏了 哈哈

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
GMP调度模型
https://firefly.cuteleaf.cn/posts/gmp调度模型/
作者
mpxw
发布于
2026-03-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
mpxw
Hello, I'm Firefly.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
12
分类
3
标签
19
总字数
13,632
运行时长
0
最后活动
0 天前

目录