请注意,本文编写于 523 天前,最后修改于 523 天前,其中某些信息可能已经过时。
Go协程调度模型是通过GMP模型来实现的。GMP模型由三个组件组成:Goroutine(G)、Machine(M)和Processor(P)。
-
Goroutine(G):
- Goroutine是Go语言中的轻量级线程,用于并发执行任务。
- 每个Goroutine都有自己的执行栈和状态信息。
- Goroutine的数量可以无限制地创建,受内存限制。
- 在Goroutine退出时,它会被放入P的本地或全局的闲置列表中以便复用。
-
Machine(M):
- Machine是对操作系统线程(OS thread)的封装,也可以看作操作系统内核线程。
- M在绑定有效的P后,进入一个调度循环。
- 调度循环的机制是从P的本地运行队列和全局队列中获取G,切换到G的执行栈上并执行G的函数,然后清理工作并回到M,如此反复。
- M的数量有限制,默认数量限制是10000,但实际上内核很难支持这么多线程数,所以这个限制可以忽略。
-
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:
- Golang 协程调度之 GMP 模型 - 掘金
- Go|Golang 调度器设计思想、GMP 协程调度模型详解 - 知乎
- 调度机制概述 | 深入Go语言之旅
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!