一、什么是 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 高并发的底层基石。