GMP有哪些状态

G (goroutine)

G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用go关键词创建.

举例来说, func main() { go other() }, 这段代码创建了两个goroutine,

一个是main, 另一个是other, 注意main本身也是一个goroutine.

goroutine的新建, 休眠, 恢复, 停止都受到go运行时的管理.

goroutine执行异步操作时会进入休眠状态, 待操作完成后再恢复, 无需占用系统线程,

goroutine新建或恢复时会添加到运行队列, 等待M取出并运行.

M (machine)

M是machine的头文字, 在当前版本的golang中等同于系统线程.

M可以运行两种代码:

  • go代码, 即goroutine, M运行go代码需要一个P
  • 原生代码, 例如阻塞的syscall, M运行原生代码不需要P

M会从运行队列中取出G, 然后运行G, 如果G运行完毕或者进入休眠状态, 则从运行队列中取出下一个G运行, 周而复始.

有时候G需要调用一些无法避免阻塞的原生代码, 这时M会释放持有的P并进入阻塞状态, 其他M会取得这个P并继续运行队列中的G.

go需要保证有足够的M可以运行G, 不让CPU闲着, 也需要保证M的数量不能过多.

P (process)

P是process的头文字, 代表M运行G所需要的资源.

一些讲解协程的文章把P理解为cpu核心, 其实这是错误的.

虽然P的数量默认等于cpu核心数, 但可以通过环境变量GOMAXPROC修改, 在实际运行时P跟cpu核心并无任何关联.

P也可以理解为控制go代码的并行度的机制,

如果P的数量等于1, 代表当前最多只能有一个线程(M

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 语言进行调度的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值