20200310
Plan
go源码学习
Notes
初始化
go的汇编代码会调用以下几个初始化函数 CALL runtime.args(SB) //作用是整理命令行参数
CALL runtime.osinit(SB) //作用是确定CPU core数量
CALL runtime.schedinit(SB) //几乎包括所有运行时环境初始化构造,包括 1.设置最大系统线程数量限制 2.栈、内存分配器、调度器相关初始化 3.处理命令行参数和环境变量 4.处理GODEBUG、GOTRACEBACK调试相关的环境变量设置 5.垃圾回收器初始化 6.通过CPU core和GOMAXPROCS环境变量确定Process数量 7.调整Process数量
接下来会执行runtime.main 1.设置执行栈的最大限制 2.启动系统后台监控(定期垃圾回收,以及并发任务调度相关的信息) 3.执行runtime包内所有的初始化函数(runtime_init) 4.启动垃圾回收器后台操作 5.执行所有用户包(包括标准库)初始化函数init(main_init) 6.执行用户逻辑入口main.main函数
其中3中的runtime内相关的多个init函数被赋予统一符号名,然后再由runtime.init统一调用 5中的main.init情况基本一致,区别在于它负责调用非runtime包的初始化函数
总结: 1.所有init函数都在同一个goroutine内执行 2.所有init函数结束后才会执行main.main函数
More
个人理解: runtime.main前主要初始化go需要运行的必要环境,runtime.main中主要初始化函数。