G、P、M和全局队列是GPM模型的关键组成部分, 用于实现并发和调度.

  • G(Goroutine): Goroutine 是 Go 语言中轻量级线程的概念, 它是并发执行的基本单位. 每个 Goroutine 都是由 Go 运行时 (runtime) 管理的, 它可以看作是一个独立的执行线程. Goroutine 可以通过 go 关键字启动, 它们之间可以相互通信和同步.

  • P(Processor): P 是上下文处理器的缩写, 它代表了一组逻辑处理器. 每个逻辑处理器负责调度和执行 Goroutine. P 的数量由 Go 运行时根据系统和配置自动管理, 每个 P 绑定到一个操作系统线程上, 并负责管理一组 Goroutine 的调度.

  • M(Machine): M 代表了操作系统的线程 (thread) , 它是一个真实的系统线程, 由操作系统调度和管理. 每个M对应一个操作系统线程, 它负责执行 P 中调度的 Goroutine. M 和 P 是多对多的关系, 一个 M 可以关联多个 P.

  • 全局队列 (Global Queue): 全局队列是 GPM 模型中的一部分, 它是用于存储还未被分配到 P 上的 Goroutine 的队列. 当一个 Goroutine 启动时, 它首先会进入全局队列. 然后, 空闲的 P 会从全局队列中获取 Goroutine 进行调度和执行.

GPM 模型的核心思想是将 Goroutine 的调度和执行分离, 通过 P 和 M 的组合来实现高效的并发. P 负责管理 Goroutine 的调度, M 负责执行调度的 Goroutine, 并与操作系统线程进行关联.

全局队列在调度过程中起到了重要的作用, 它允许 Goroutine 在等待被P调度时暂时存储在队列中, 以便其他 P 能够获取并执行.

需要注意的是, GPM 模型是 Go 语言运行时的内部实现细节, 对于大多数开发者来说, 无需直接操作和管理 G、P、M 和全局队列, 因为 Go 语言的并发机制和调度器会自动处理这些细节, 使开发者能够专注于编写高效并发的代码.

results matching ""

    No results matching ""