go如何进行调度的,GMP中状态流转
时间: 2024-03-29 20:34:37 浏览: 18
Go 语言通过 GMP(Goroutine, M, P) 模型来进行调度,其中 Goroutine 是 Go 语言中的轻量级线程,M(Machine)是 Go 语言运行时的线程,P(Processor)是逻辑处理器,它用于管理 Goroutine 的运行和调度。
Goroutine 会被调度到 M 上执行,M 可以同时运行多个 Goroutine,每个 M 都有一个 P 和一个 G 的队列,P 用于管理和调度 Goroutine,G 队列存储等待运行的 Goroutine,队列中的 Goroutine 按照 FIFO(先进先出)的原则进行调度。
当一个 Goroutine 需要被执行时,P 会从 G 队列中取出一个 Goroutine,将其与一个 M 绑定,然后再将 M 放入运行队列中等待 CPU 执行。当一个 Goroutine 阻塞时,P 会将其从 M 上摘下,然后将其放入等待队列中等待下一次调度。
在 GMP 模型中,M 和 P 之间有三种状态(Running、Idle、Blocked),M 和 G 之间也有三种状态(Running、Runnable、Waiting):
- M 的 Running 状态表示该 M 正在执行 Goroutine;
- M 的 Idle 状态表示该 M 没有 Goroutine 可以执行;
- M 的 Blocked 状态表示该 M 正在等待某些事件的发生,比如等待 Goroutine 阻塞或等待系统资源;
- G 的 Running 状态表示该 Goroutine 正在被某一个 M 执行;
- G 的 Runnable 状态表示该 Goroutine 准备好被执行,但是还没有被 M 取走;
- G 的 Waiting 状态表示该 Goroutine 正在等待某些事件的发生,比如等待 I/O 完成或等待定时器超时。
总之,GMP 模型是 Go 语言调度的核心,它的状态流转是 Go 语言进行调度的基础。