Golang 的 goroutine 是通过 Go 运行时(Go runtime)实现的。具体来说,当一个 Go 程序启动时,会创建一个操作系统线程,并在其上运行一个称为 G0 的 goroutine。在程序执行期间,当我们使用 go 关键字启动新的 goroutine 时,Go 运行时会负责将该 goroutine 分配到可用的操作系统线程上执行。
在 Golang 中,每个操作系统线程都维护了一个 M (machine)结构体,该结构体是与操作系统线程一对一关联的。M 结构体中包含了调度器所需的状态信息和堆栈空间等信息。而每个正在运行的 goroutine 都有一个对应的 G (goroutine)结构体,它保存了 goroutine 执行时所需要的所有信息。
此外,在 Golang 中还有另外两个重要的组件:P (processor)和调度器(scheduler)。P 是逻辑处理器(logical processor),它与 M 一样也是由 Go 运行时管理的。当一个新的 goroutine 被创建时,调度器会将其分配给 P 上执行。当 P 上没有可用的工作(即没有可用的 goroutine)时,调度器会从全局队列中获取已准备好执行但尚未分配给 P 的 goroutine,并将其分配给某个 P 上去执行。
总之,在 Golang 中,goroutines 是由 Go 运行时管理并分配到逻辑处理器上执行的。通过这种方式,Golang 实现了高效的并发编程。




