Go程序如何运行
Go程序如何运行?
Go程序的入口
第一行代码在runtime包中
runtime/rt0_XXX.s
读取命令行参数
- 复制参数数量argc和参数值argv到栈上
初始化g0执行栈
- g0是为了调度协程而产生的协程
- g0是每个go语言的第一个协程
运行时检测
- 检查各类型的长度
- 检查指针操作
- 检查结构体字段的偏移量
- 检查atomic原子操作
- 检查CAS操作
- 检查栈大小是否是2的幂次
参数初始化runtime.args
- 对命令行中的参数进行处理
- 参数数量赋值给
argc int32
- 参数值复制给
argv **byte
调度器初始化rumtime.shedinit
- 全局栈空间内存分配
- 加载命令行参数到os.Args
- 堆内存空间的初始化
- 加载操作系统环境变量
- 初始化当前系统线程
- 垃圾回收器的参数初始化
- 算法初始化(map、hash)
- 设置process数量
创建主协程
- 创建一个新的协程,执行runtime.main
- 放入调度器等待调度
初始化M
- 初始化一个M,用来调度主协程
主协程执行主函数
- 执行runtime包中的init方法
- 启动GC垃圾收集器
- 执行用户包依赖的init方法
- 执行用户主函数main.main()
Go程序如何运行
http://example.com/2022/12/17/Go程序如何运行/