一光年

[Go-goroutine介绍] 1. goroutine与线程的关系

2019.06.27

在Go语言中,运行时会在逻辑处理器上调度goroutine来运行,每个逻辑处理器对应了一个物理处理器。

当一个goroutine被创建时,它会被调度器放到全局运行队列中。之后,队列中的某些goroutine会被分配给一个逻辑处理器,并放到这个逻辑处理器对应的本地队列中等待,直到被该处理器执行。

如图,双核系统上运行有Go程序。G1、G3和G4被分配给了逻辑处理器P1,G2和G5被分配给了逻辑处理器P2。另有G6、G7和G8在全局队列中待调度。

goprocedure

依图所见,goroutine与线程的关系就很明显了。

  • 1个物理处理器对应了Go中的1个逻辑处理器
  • 1个逻辑处理器被绑定在单个操作系统线程(对应了1个线程)
  • 每个goroutine在调度器的调度下,共享该线程的所有资源(包括计算资源)