简述一下全局运行队列中获取goroutine ?

在 Go 中,goroutine 是由 Go 运行时(runtime)系统管理的轻量级线程。Go 运行时使用了一个 M:N 的调度模型,即 M 个 goroutine 运行在 N 个 OS 线程上。

Go 的运行时系统有一个全局运行队列,其中存储了处于 runnable 状态(即准备运行或已经在运行)的 goroutine。

当一个 OS 线程(在 Go 的上下文中,我们称之为 M)需要运行 goroutine 时,它会先从自己的本地运行队列中获取 goroutine。如果本地运行队列为空(或者在一定条件下),它会尝试从全局运行队列中获取 goroutine。

具体来说,当一个 M(OS 线程)无法从本地 P(处理器,这是一个包含本地运行队列的结构)获取 goroutine 时,它会尝试以下操作:

  1. 从全局运行队列获取 goroutine。
  2. 从其他 P 的本地运行队列偷取 goroutine。

这种策略使得 Go 运行时可以在多个 OS 线程之间公平地分配 goroutine,从而最大限度地利用多核处理器,同时还能在一个线程被阻塞时,让其他线程可以继续执行其他 goroutine。

需要注意的是,全局运行队列及其调度细节主要是 Go 运行时的实现细节,对于开发者来说,通常无需深入了解。Go 语言的并发模型主要通过高级的并发原语,如 goroutine、channel 和 select,提供给开发者使用。

发表评论

后才能评论