Go程序如何运行

Go程序如何运行?

Go程序的入口

第一行代码在runtime包中

runtime/rt0_XXX.s

image-20221217112513003



读取命令行参数

  • 复制参数数量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程序如何运行/
Author
WYX
Posted on
December 17, 2022
Licensed under