GMP怎么调度goroutine(重点)

GMP 是 Go 语言运行时(runtime)的 调度器(scheduler)的核心组件,它负责调度和管理 goroutine 的执行

GMP 是由以下三个部分组成:

G(Goroutine):G 代表一个 goroutine,它包含了 goroutine 执行的上下文信息,如栈、指令指针等。当一个 goroutine 被创建时,一个 G 对象被分配给它。

M(Machine):M 代表一个执行线程(thread),也称为机器(machine)。每一个 M 对象都关联着一个操作系统线程,它负责执行 goroutine。M 被 GMP 调度器管理和分配。

P(Processor):P 代表一个处理器,它绑定了一个 M 和一组可运行的 GP 的主要任务是从可运行的 G 队列中选择一个 G,并将其分配给关联的 M 执行。

调度器的工作流程如下:

  1. 当一个 goroutine 被创建时,调度器会将其放入一个可运行的 G 队列中。

  2. 当一个 M 空闲时,它会从全局队列中获取一个可运行的 G。如果全局队列为空,则从其他 M 的本地队列中窃取一个 G。

  3. M 将选中的 G 作为当前正在执行的 goroutine,并执行它。

  4. 当 G 遇到阻塞操作(如等待 I/O、等待锁)时,M 将放弃执行该 G,并从全局队列中获取一个新的可运行的 G。

  5. 如果一个 M 持续执行一个 goroutine 超过一定时间,调度器会强制抢占 M,将其切换到其他 M 执行。

  6. 当一个 goroutine 执行完毕,M 将从本地队列或全局队列中获取一个新的可运行的 G。

这种基于 GMP 的调度器设计使得 Go 语言能够高效地管理和调度大量的 goroutine,并充分利用多核处理器的并行性能。Go 语言的调度器是由运行时自动管理的,无需手动干预。开发者只需要编写好并发代码,调度器会自动负责调度 goroutine 的执行。

你可能感兴趣的:(golang)