Last Regrets

关于Go语言在操作系统上的调度

· sdttttt

最近一直在写Go,对这个语言的体会也是越来越深。

go作为编译类语言,能直接构建对应平台的二进制文件,但是实际上语言本身也是有runtime的。

这点其实和其他语言很不一样,所以这篇文章就来讲讲这个。

首先需要知道,go编译出来的二进制,确实是实打实的纯汇编产物。

中间不会经过任何的指令翻译层,这也意味着不需要模拟任何寄存器的操作。

具体,go是如何在纯指令的汇编中加入rt的:

goroutine是什么具体我就不说了,主要讲讲goroutine是如何调度的。

首先go的rt并不是时时刻刻都在运行的,因为go不是虚拟机语言,没有寄存器模拟这种东西。

系统线程在执行指令的时候rt不可能会插入进来。

rt具体是如何介入指令之中的:

go编译器在编译go代码的时候会在生成的汇编指令中加入一些安全点,也可以叫做桩。

运行到安全点后,goroutine的上下文就会保存,rt就会开始运行,判断此刻是否要让出资源,或者要不要做GC