Go语言GMP 指的是什么

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 问答

Go语言GMP 指的是什么呢?G(Goroutine)、M(Machine)、P(Processor)

G(Goroutine):我们所说的协程,为用户级的轻量级线程,每个 Goroutine 对象中的 sched 保存着其上下文信息。 M(Machine):对内核级线程的封装,数量对应真实的 CPU 数(真正干活的对 象)。 P(Processor):即为 G 和 M 的调度对象,用来调度 G 和M 之间的关联关系, 其数量可通过 GOMAXPROCS()来设置,默认为核心数。

1 回复

Go语言中的GMP模型是Go运行时(runtime)用于处理并发任务的核心机制。GMP分别代表Goroutine、M(Machine,代表执行Go代码的线程)和P(Processor,代表执行Go代码所需的上下文或资源)。这个模型是Go语言实现高并发性能的关键。

Goroutine (G)

Goroutine是Go语言中的轻量级线程,它比传统的线程(如操作系统线程)更轻量,成千上万的Goroutine可以并发运行在少量的操作系统线程上。Goroutine的调度由Go的runtime管理,而不是由操作系统直接管理。

Machine (M)

M代表执行Go代码的线程,它是操作系统线程的直接映射。M的数量由Go运行时根据系统负载动态调整,但通常远少于Goroutine的数量。每个M必须绑定一个P才能执行Goroutine中的代码。

Processor §

P代表处理器,是Goroutine调度和执行的上下文。它包含运行Goroutine所需的所有资源,如内存分配状态、任务队列等。P的数量是固定的,并且与系统中的CPU核心数相关。每个P可以绑定一个或多个M,但是任意时刻,P只能被一个M执行。

示例代码(概念性,非直接GMP操作)

虽然GMP模型是Go运行时内部实现的细节,但你可以通过编写Goroutine来间接体验它的效果:

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done()
	fmt.Printf("Worker %d starting\n", id)

	// 模拟工作负载
	runtime.Gosched() // 让出CPU,以演示调度

	fmt.Printf("Worker %d done\n", id)
}

func main() {
	var wg sync.WaitGroup

	// 设置最大并行Goroutine数
	runtime.GOMAXPROCS(4)

	for i := 1; i <= 10; i++ {
		wg.Add(1)
		go worker(i, &wg)
	}

	wg.Wait()
	fmt.Println("All workers done")
}

上述代码演示了如何创建和等待多个Goroutine完成。尽管没有直接操作GMP,但背后的调度机制正是由GMP模型支撑的。通过调整runtime.GOMAXPROCS,你可以控制P的数量,从而影响并发性能。然而,需要注意的是,直接调整runtime.GOMAXPROCS并不是优化Go程序性能的唯一或推荐方式。

回到顶部