Golang GMP模型 笔记

Golang GMP模型 笔记

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

本文讲解了Golang中协程调度器的优化,包括GMP模型和调度器的设计策略。G代表协程,P代表协程处理器,M代表内核态线程。调度器利用线程复用、并行、抢占和全局队列来提高性能。创建协程时考虑局部性、队列满和自旋线程等机制。当协程阻塞时,会重新绑定P或从全局队列中取出。

🎯

关键要点

  • 本文讲解了Golang中协程调度器的优化,包括GMP模型和调度器的设计策略。
  • GMP模型中的G代表协程,P代表协程处理器,M代表内核态线程。
  • 调度器利用线程复用、并行、抢占和全局队列来提高性能。
  • 创建协程时考虑局部性、队列满和自旋线程等机制。
  • 当协程阻塞时,会重新绑定P或从全局队列中取出。
  • 线程复用机制包括work stealing和hand off。
  • 可以指定多个P以充分利用多核CPU。
  • 协程存在抢占机制,类似于进程抢占CPU。
  • 全局队列用于存放无法从其他P队列中stealing的G。
  • M0用于初始化环境,G0负责P队列中G的调度。
  • 创建G时考虑局部性、队列满和自旋线程。
  • 自旋线程尝试唤醒休眠线程并进行负载均衡。
  • 自旋线程和执行线程的总数受限于$GOMAXPROCS。
  • 阻塞的G需要在P上执行,可能会被加到全局队列。
➡️

继续阅读