GMP 模型是 Go 语言运行时系统的核心模型,用于管理 goroutine、线程(M)和处理器(P)。
**G(Goroutine)**:
- 是 Go 语言中轻量级的执行线程。
- 可以理解为用户级的线程,创建开销小,资源占用少。
**M(Machine 或 OS Thread)**:
- 代表操作系统线程。
- 实际执行计算任务。
**P(Processor)**:
- 是一个逻辑处理器,关联着一个 M 和一个运行队列。
- 起到调度 G 的作用,为 G 分配 M 来执行。
GMP 模型的工作流程大致如下:
1. 新创建的 G 被放入 P 的本地队列。C-->P-->M
2. P 会从本地队列获取可运行的 G 分配给 M 执行。
3. 如果本地队列为空,P 会尝试从全局队列获取 G。
4. 当 M 因系统调用等原因阻塞时,P 会与 M 分离,寻找新的 M 来继续执行任务。
GMP 模型使得 Go 语言能够高效地利用多核处理器,实现高并发的编程。以下是一个简单的示例代码,展示如何创建多个 goroutine :
package main
import (
"fmt"
"time"
)
func task(id int) {
fmt.Printf("Task %d is running\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("Task %d is done\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go task(i)
}
time.Sleep(5 * time.Second)
}
在上述代码中,通过 `go` 关键字创建了 5 个 goroutine 来并发执行 `task` 函数。