最近看了下的雨痕大大写的go1.5源码剖析的pdf,觉得有必要写点东西来巩固一下。
本人水平有限,第一次写,大家轻喷啊。
01初始化
一开始雨痕大大就通过汇编代码找到了初始化里面几个关键的函数。
- runtime.args 没什么好看的就是传入cmd的运行参数。
- runtime.osinit 就是看一下系统的核数。
- runtime.schedinit比较重要
runtime.schedinit
有初始化栈,内存分配器和调度器, 垃圾回收器, 还会进行一次procresize调整一下GMP的并发调度中P的数量。
runtime·newproc(SB)和runtime·mstart(SB)就是用来运行runtime.main函数的。
runtime·main 会启动 sysmon一个辅助控制goroutine和垃圾回收程序。runtime_init runtime包的init函数。gcenable 启动gc的。 main_init() 初始化用户包的init函数。main_main用户逻辑入口
最后雨痕大大给了个强调:
- 所有init函数都在同一个goroutine内运行。
- 所有init函数结束后才会执行main.main函数。