GMP 模型是 Go 的运行时系统采用的一种并发模型,它将 M (machine)、P (processor) 和 G (goroutine) 三者分离开来,通过一些特殊的机制协调它们之间的关系。
M 是线程,它负责执行 G。而 P 是 M 的管理者,P 可以看做是 M 的一种抽象,它维护一个运行队列,其中保存了等待执行的 G。当 M 完成任务后,P 会从队列中取出一个 G,然后将该 G 绑定到当前的 M 上,最后调度 M 执行该 G 的代码。G 则是 Go 语言并发的最小单位,它包含了一个函数和运行该函数所需要的资源,比如堆栈和上下文。
GMP 模型可以根据应用程序的需要自动创建或者销毁线程,以实现并行处理,同时,通过 P 的抽象,可以在不同的 M 上运行多个 G,从而让 Go 程序在多核 CPU 上发挥出更好的性能。
下面是一个简单的示例,展示了 GMP 模型的工作原理:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))
go func() {
for i := 0; i < 10; i++ {
fmt.Println("Goroutine: ", i)
}
}()
for i := 0; i < 10; i++ {
fmt.Println("Main: ", i)
}
}
在这个示例中,我们使用了 runtime.GOMAXPROCS() 函数来设置最大可用的 CPU 核心数,然后通过 go 关键字启动了一个新的 goroutine,最后在主 goroutine 中输出了一些信息。
当程序运行时,Go 运行时系统会根据需要自动创建线程和 goroutine,然后将它们绑定到 M 和 P 上,最终实现并发执行。