go GMP

130 阅读1分钟
  • 进程是操作系统资源分配的基本单位

  • 线程是操作系统调度的基本单位

  • 协程是轻量级的线程,依赖于线程。但是协程具有更快的上下文切换速度,灵活的调度策略

  • G: Goroutine,即我们在 Go 程序中使用 go 关键字创建的执行体;

  • M: Machine,或 worker thread,即传统意义上进程的线程;

  • P: Processor,即一种人为抽象的、用于执行 Go 代码被要求局部资源。只有当 M 与一个 P 关联后才能执行 Go 代码。除非 M 发生阻塞或在进行系统调用时间过长时,没有与之关联的 P。 协程状态:

图片.png

  • ◎ _Gidle为协程刚开始创建时的状态,当新创建的协程初始化后,会变为_Gdead状态,_Gdead状态也是协程被销毁时的状态。
  • ◎ _Grunnable表示当前协程在运行队列中,正在等待运行。
  • ◎ _Grunning代表当前协程正在被运行,已经被分配给了逻辑处理器和线程。
  • ◎ _Gwaiting表示当前协程在运行时被锁定,不能执行用户代码。在垃圾回收及channel通信时经常会遇到这种情况。
  • ◎ _Gsyscall代表当前协程正在执行系统调用。
  • ◎ _Gpreempted是Go 1.14新加的状态,代表协程G被强制抢占后的状态。
  • ◎ _Gcopystack代表在进行协程栈扫描时发现需要扩容或缩小协程栈空间,将协程中的栈转移到新栈时的状态。

特殊的g0协程: 协程g0运行在操作系统线程栈上,其作用主要是执行协程调度的一系列运行时代码

P的状态:

图片.png

参考: colobu.com/2017/05/04/…