CPU无法理解文本,只能执行一条一条的二进制机器码指令,每次执行完一条指令,PC寄存器 就会指向下一条积蓄执行。
在 64位机器 上,PC寄存器 = rip
而对于 Go program 可执行文件,运行依赖两部分:用户程序 以及 Go Runtime。
那么 Go Runtime 是什么?
「可以认为
runtime是为了实现额外的功能,在程序运行中自动加载/运行的一些模块。」
上图说明了在运行过程中的 go 程序的调用以及位置。对于 runtime ,主要包含这几个部分:
| 组成部分 | 作用 |
|---|---|
scheduler | 调度器管理所有后台的 G,M,P 执行循环调度 |
netpoll | 网络轮训负责管理 网络fd 相关的读写 |
memory | 负责内存分配工作 |
garbage | GC回收器 |
这些模块中,最核心的就是 scheduler ,负责串联所有的 runtime 流程。
调度组件
go func() {
println("Hello, Scheduler!")
}
执行这段代码时,其实是向 runtime 提交了一个计算任务。而任务执行是在 runtime 中,这个过程就类似生产任务,消费任务。
这不就是生产-消费模型吗?
所以:Go 调度流程本质上就是一个生产-消费流程。