GMP 模型是一种调度策略/模型,是让 Go 实现并发的关键模型,
| 组件 | 描述 |
|---|---|
| G (Goroutine) | 表示一个 Goroutine,包含栈和相关的上下文信息 |
| M (Machine) | 表示一个执行线程,负责将 Goroutine 映射到操作系统的线程上。每个 M 都有自己的调用栈和寄存器状态 |
| P (Processor) | 表示一个逻辑处理器,维护一个处于可运行状态的 Goroutine 队列,每个 M 都和一个 P 相关联 |
在GMP 调度器这个笔记当中,详细介绍了这个模型:
- 创建一个
G如果本地队列没满,则随机放入一个未满的本地队列,否则放入全局队列。 - 执行
GP会获取一个G在M中执行,若G产生systemCall阻塞,则会将M放入休眠队列,并从休眠队列中取出一个M接管P执行,若休眠队列为空则创建一个新的M来接管P。 - 获取
G若本地队列中G已经执行完,则尝试从从全局队列中获取G,若全局队列中没有可运行的G, 则从其他P的本地队列中偷取G
