GMP 模型是一种调度策略/模型,是让 Go 实现并发的关键模型,

组件描述
G (Goroutine)表示一个 Goroutine,包含栈和相关的上下文信息
M (Machine)表示一个执行线程,负责将 Goroutine 映射到操作系统的线程上。每个 M 都有自己的调用栈和寄存器状态
P (Processor)表示一个逻辑处理器,维护一个处于可运行状态的 Goroutine 队列,每个 M 都和一个 P 相关联

GMP 调度器这个笔记当中,详细介绍了这个模型:

  1. 创建一个 G 如果本地队列没满,则随机放入一个未满的本地队列,否则放入全局队列。
  2. 执行 G P 会获取一个 GM 中执行,若 G 产生 systemCall 阻塞,则会将 M 放入休眠队列,并从休眠队列中取出一个 M 接管 P 执行,若休眠队列为空则创建一个新的 M 来接管 P
  3. 获取 G 若本地队列中 G 已经执行完,则尝试从从全局队列中获取 G,若全局队列中没有可运行的 G, 则从其他 P 的本地队列中偷取 G

schedule