Go Runtime 的总览
golang 的 runtime 在 golang 中的地位类似于 Java 的虚拟机,不过 go runtime 不是虚拟机. golang 程序生成可执行文件在指定平台上即可运行,效率很高, 它和 c/c++ 一样编译出来的是二进制可执行文件. 我们知道运行 golang 的程序并不需要主机安装有类似 Java 虚拟机之类的东西,那是因为在编译时,golang 会将 runtime 部分代码链接进去.
golang 的 runtime 核心功能包括以下内容:
- 协程(goroutine)调度(并发调度模型)
- 垃圾回收(GC)
- 内存分配
- 使得 golang 可以支持如 pprof、trace、race 的检测
- 支持 golang 的内置类型 channel、map、slice、string等的实现
- 等等
下图 1 是 golang 程序、runtime、可执行文件与操作系统之间的关系. 区别于 Java 需要安装虚拟机,go 语言的可执行文件已经包含了 golang 的 runtime,它为用户的 go 程序提供协程调度、内存分配、垃圾回收等功能.此外还会与系统内核进行交互,从而真正的利用好 CPU 等资源. 本文主要简单介绍 golang runtime 的并发调度模型、垃圾回收与内存分配.
协程调度模型
调度是操作系统的核心功能了,从计算机诞生以来,任务的调度就一直在不断改进与发展,以不断适应计算机的发展. 单任务、多任务、并发、并行等调度.