当前位置:  首页>> 技术小册>> GO面试指南

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 模型的工作原理:

  1. package main
  2. import (
  3. "fmt"
  4. "runtime"
  5. )
  6. func main() {
  7. fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))
  8. go func() {
  9. for i := 0; i < 10; i++ {
  10. fmt.Println("Goroutine: ", i)
  11. }
  12. }()
  13. for i := 0; i < 10; i++ {
  14. fmt.Println("Main: ", i)
  15. }
  16. }

在这个示例中,我们使用了 runtime.GOMAXPROCS() 函数来设置最大可用的 CPU 核心数,然后通过 go 关键字启动了一个新的 goroutine,最后在主 goroutine 中输出了一些信息。

当程序运行时,Go 运行时系统会根据需要自动创建线程和 goroutine,然后将它们绑定到 M 和 P 上,最终实现并发执行。


该分类下的相关小册推荐: