编辑
2023-12-04
后端
00
请注意,本文编写于 523 天前,最后修改于 523 天前,其中某些信息可能已经过时。

Go协程调度模型是通过GMP模型来实现的。GMP模型由三个组件组成:Goroutine(G)、Machine(M)和Processor(P)。

  1. Goroutine(G):

    • Goroutine是Go语言中的轻量级线程,用于并发执行任务。
    • 每个Goroutine都有自己的执行栈和状态信息。
    • Goroutine的数量可以无限制地创建,受内存限制。
    • 在Goroutine退出时,它会被放入P的本地或全局的闲置列表中以便复用。
  2. Machine(M):

    • Machine是对操作系统线程(OS thread)的封装,也可以看作操作系统内核线程。
    • M在绑定有效的P后,进入一个调度循环。
    • 调度循环的机制是从P的本地运行队列和全局队列中获取G,切换到G的执行栈上并执行G的函数,然后清理工作并回到M,如此反复。
    • M的数量有限制,默认数量限制是10000,但实际上内核很难支持这么多线程数,所以这个限制可以忽略。
  3. Processor(P):

    • Processor是调度器的组件,也可以看作虚拟处理器。
    • P维护着存储M和G的本地运行队列。
    • P的数量决定了系统内最大可并行的G的数量。
    • P的数量受本机的CPU核数影响,默认为CPU核心数。

调度过程:

  • 当一个P执行一个G时,其他的G会等待。
  • 当正在执行的G遇到阻塞情况(如IO操作),调度器会去执行其他的G。
  • 协程的调度是非抢占式的,由协程主动交出控制权。
  • 协程可能切换的点包括IO、select、channel、等待锁和runtime.Gosched()。

Go协程调度模型的优势:

  • 轻量快速:协程在用户态线程即完成切换,不会陷入内核态,切换非常轻量快速。
  • 并发能力:通过将大量的Goroutine分配到少量的线程上执行,并利用多核并行,实现更强大的并发能力。

Learn more:

  1. Golang 协程调度之 GMP 模型 - 掘金
  2. Go|Golang 调度器设计思想、GMP 协程调度模型详解 - 知乎
  3. 调度机制概述 | 深入Go语言之旅

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!