Go 面试题:GMP 调度模型与高并发原理

一、什么是 GMP

Go 并发调度模型三要素:

角色 含义
G (Goroutine) 用户态轻量协程,初始栈仅 2KB,按需增长
M (Machine) 操作系统线程,真正执行 G
P (Processor) 逻辑处理器,持有本地 G 队列,M 必须绑 P 才能跑 G

二、调度流程

  • 每个 P 有本地运行队列(约 256 个 G);
  • M 绑 P 后取 G 执行;
  • 本地空了就去全局队列或其他 P 处偷任务(work-stealing),保持各核均衡;
  • G 阻塞(如系统调用)时,M 与 P 解绑,P 交给别的 M 继续跑其他 G(hand-off)。

三、为什么高效

调度在用户态完成(不进内核),G 切换成本远低于 OS 线程;海量 goroutine(数十万)也能扛。对比 Java 线程 1MB 栈、内核调度,Go 在 IO 密集型服务上优势明显。

要点:goroutine 不是线程,GMP 是 Go 高并发的底层基石。