Go 的并发模型是基于 M (Machine)、P (Processor) 和 G (Goroutine) 的 MPG 模型。
M:代表着操作系统中的线程或者内核级线程,它负责管理一个或多个 P,并为 G 提供了运行时的环境。
P:代表着逻辑处理器或者处理器上下文,它的主要作用是调度 G,负责分发和回收 G,并在必要的时候与 M 进行协作。
G:代表着 Go 协程,它是 Go 并发模型的核心。一个 G 可以看作是一种轻量级的线程,它由 Go 运行时系统管理和调度,可以在一个 P 上运行,并通过通道(channel)和其他 G 进行通信。
MPG 模型是 Go 并发模型的核心,它能够提供高效的并发,通过将 G 和 P 配对,Go 运行时系统可以动态地将 Goroutine 映射到适当的 P 上,并通过调整 P 的数量来适应负载的变化。同时,Go 运行时系统可以根据需要在 M 之间移动 P,以便更好地利用计算机中的所有处理器核心。
在 MPG 模型中,每个 P 都有一个与之关联的本地运行队列(runqueue),以及一个全局运行队列(global runqueue)。当一个 Goroutine 需要执行时,它会被放置在 P 的本地运行队列中。如果本地运行队列为空,则 P 会从全局运行队列中获取 Goroutine。
MPG 模型的优点在于,它可以通过动态地管理 Goroutine 和 Processor 的数量来提高 Go 程序的性能和吞吐量。同时,它还可以利用现代计算机中的多核处理器,提供更好的并发性能。