加入收藏 | 设为首页 | 会员中心 | 我要投稿 泉州站长网 (https://www.0595zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

详解 Go 程序的启动流程

发布时间:2021-04-18 16:44:32 所属栏目:动态 来源:互联网
导读:根据济南站长网 Www.0531Zz.Com报道 ntime.check:运行时类型检查,主要是校验编译器的翻译工作是否正确,是否有 坑。基本代码均为检查 int8 在 unsafe.Sizeof 方法下是否等于 1 这类动作。 runtime.args:系统参数传递,主要是将系统参数转换传递给程序使用
  • 根据济南站长网  Www.0531Zz.Com报道
 
  • ntime.check:运行时类型检查,主要是校验编译器的翻译工作是否正确,是否有 “坑”。基本代码均为检查 int8 在 unsafe.Sizeof 方法下是否等于 1 这类动作。
  • runtime.args:系统参数传递,主要是将系统参数转换传递给程序使用。
  • runtime.osinit:系统基本参数设置,主要是获取 CPU 核心数和内存物理页大小。
  • runtime.schedinit:进行各种运行时组件的初始化,包含调度器、内存分配器、堆、栈、GC 等一大堆初始化工作。会进行 p 的初始化,并将 m0 和某一个 p 进行绑定。
  • runtime.main:主要工作是运行 main goroutine,虽然在runtime·rt0_go 中指向的是$runtime·mainPC,但实质指向的是 runtime.main。
  • runtime.newproc:创建一个新的 goroutine,且绑定 runtime.main 方法(也就是应用程序中的入口 main 方法)。并将其放入 m0 绑定的p的本地队列中去,以便后续调度。
  • runtime.mstart:启动 m,调度器开始进行循环调度。
  • 在 runtime·rt0_go 方法中,其主要是完成各类运行时的检查,系统参数设置和获取,并进行大量的 Go 基础组件初始化。

初始化完毕后进行主协程(main goroutine)的运行,并放入等待队列(GMP 模型),最后调度器开始进行循环调度。

小结o 语言中,实际的运行入口并不是用户日常所写的 main func,更不是 runtime.main 方法,而是从 rt0_*_amd64.s 开始,最终再一路 JMP 到 runtime·rt0_go 里去,再在该方法里完成一系列 Go 自身所需要完成的绝大部分初始化动作。

其中整体包括:

  • 运行时类型检查、系统参数传递、CPU 核数获取及设置、运行时组件的初始化(调度器、内存分配器、堆、栈、GC 等)。
  • 运行 main goroutine。
  • 运行相应的 GMP 等大量缺省行为。
  • 涉及到调度器相关的大量知识。

后续将会继续剖析将进一步剖析 runtime·rt0_go 里的爱与恨,尤其像是 runtime.main、runtime.schedinit 等调度方法,都有非常大的学习价值,有兴趣的小伙伴可以持续关注。

Go 调度器初始化

知道了 Go 程序是怎么引导起来的之后,我们需要了解 Go Runtime 中调度器是怎么流转的。

(编辑:泉州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!