Go 程序运行过程「一」 |周末学习

149 阅读1分钟

CPU无法理解文本,只能执行一条一条的二进制机器码指令,每次执行完一条指令,PC寄存器 就会指向下一条积蓄执行。

在 64位机器 上,PC寄存器 = rip

而对于 Go program 可执行文件,运行依赖两部分:用户程序 以及 Go Runtime

那么 Go Runtime 是什么?

「可以认为 runtime 是为了实现额外的功能,在程序运行中自动加载/运行的一些模块。」

上图说明了在运行过程中的 go 程序的调用以及位置。对于 runtime ,主要包含这几个部分:

组成部分作用
scheduler调度器管理所有后台的 G,M,P 执行循环调度
netpoll网络轮训负责管理 网络fd 相关的读写
memory负责内存分配工作
garbageGC回收器

这些模块中,最核心的就是 scheduler ,负责串联所有的 runtime 流程。

调度组件

go func() {
  println("Hello, Scheduler!")
}

执行这段代码时,其实是向 runtime 提交了一个计算任务。而任务执行是在 runtime 中,这个过程就类似生产任务,消费任务。

这不就是生产-消费模型吗?

所以:Go 调度流程本质上就是一个生产-消费流程