Go Scheduler 的 GMP 模型

💡 原文约2000字/词,阅读约需5分钟。
📝

内容提要

Go语言的goroutine调度器基于GMP三级模型,实现窃取机制、交接机制和可抢占技术,以提升系统的吞吐量和并发程度,解决GC时可能出现的死锁和饥饿问题。

🎯

关键要点

  • Go语言的goroutine调度器基于GMP三级模型,提升系统吞吐量和并发程度。
  • GMP模型包括G(goroutine)、M(内核级线程)和P(处理器),M和P之间存在一一对应关系。
  • goroutine的调度过程包括将新创建的goroutine放入局部队列或全局队列,并通过M和P进行调度。
  • 调度策略的核心是复用,避免频繁的资源创建和销毁,以提升系统性能。
  • 工作队列的窃取机制允许空闲的M从繁忙的P中窃取任务,提升并发性。
  • 交接机制允许被阻塞的M将P交接给其他空闲的M。
  • Go 1.14版本引入可抢占技术,解决计算密集型任务导致的饥饿现象和GC时的死锁问题。
  • Go语言早期的调度模型是MG,后改为GMP模型以增加局部队列,提升调度效率。
➡️

继续阅读