GO语言的 GMP 模型是什么?
GO语言的 GMP 模型是什么?
提示
题眼: 背会即可。等价于 Go 语言是如何做协程调度的。
GMP 模型是 Go 运行时里的核心调度模型,主要用于管理 goroutine 在多个线程上的执行。
它由三部分组成:
G(Goroutine):表示一个 goroutine,本质上就是用户态协程,里面保存了栈、程序计数器、状态等信息。M(Machine):表示一个内核线程,真正负责执行 goroutine。P(Processor):表示调度器中的处理器上下文,负责维护本地队列、分配可运行的 goroutine,并和M配合完成调度。
可以简单理解为:
G是任务。M是干活的线程。P是调度资源和上下文。
每个 P 都有自己的本地运行队列,多个 P 之间还共享一个全局队列。M 必须绑定 P 才能执行 G。
调度顺序示意图如下:

随着 Go 版本迭代,GMP 也持续在优化:
GOMAXPROCS用于控制P的数量。M的创建和回收是动态的,用来适配阻塞和系统负载变化。- Go 1.14 之后的异步抢占让调度更加公平,避免 goroutine 长时间占用 CPU。
重要
参考答案:
Go 的协程调度主要就是靠 GMP 模型完成的。G 代表 goroutine,M 代表线程,P 代表调度器里的处理器上下文。真正执行代码的是 M,真正被调度的对象是 G,而 P 负责把合适的 G 交给 M 去运行。
每个 P 自己会维护一个本地 goroutine 队列,新创建的大部分 goroutine 会优先放到本地队列里。如果本地队列满了,或者调度过程中出现负载不均,就会借助全局队列和工作窃取机制来重新分配任务。
可以把 GMP 简单理解成一套更轻量的协程调度模型,它的目标就是尽量减少线程切换成本,提高 CPU 利用率,并让大量 goroutine 可以高效地跑起来。
