Go并发编程实战
上QQ阅读APP看书,第一时间看更新

1.5 运行时

虽然Go程序编译后生成的是本地可执行代码,但是这些可执行代码必须运行在Go语言的运行时(Runtime)中。Go运行时类似Java和.NET语言所用到的虚拟机,主要负责管理包括内存分配、自动垃圾回收、栈处理、协程(Goroutine)、信道(Channel,也称为通道)、切片(slice)、字典(map)和反射(reflect)等。Go语言的Runtime运行机制可以用图1.12来描述。

图1.12 Go语言的Runtime运行机制图

图1.12描述了Go程序、Go运行时和操作系统内核之间的关系。Go运行时和用户编译后的代码被Go链接器(Linker)静态链接起来,形成一个可执行文件。从运行的角度来说,这个Go可执行文件由两部分组成:一部分是用户的代码,另一部分就是Go运行时。

Go运行时通过接口函数调用来管理协程(Goroutine)和信道(Channel)等功能。Go用户代码对操作系统内核API的调用会被Go运行时拦截并处理。

Go运行时的重要组成部分是协程调度器(Goroutine Scheduler)。它负责追踪、调度每个协程运行,实际上是从应用程序的进程(Process)所属的线程池(Thread Pool)中分配一个线程执行这个协程。因此,与Java虚拟机中的Java线程和操作系统(OS)线程映射概念类似,每个协程只有分配到一个操作系统线程才能运行。

注意

虽然Java或者.NET有虚拟机的概念,但是在某些方面其执行效率不一定比Go语言低。