用dlv调试发现runtime.g0和runtime.m0 在一开始就有值了 那这个是什么时候复值

来源:1-13 Go 语言的内存管理与垃圾回收

慕尼黑2207807

2021-06-09 21:55:19

用dlv调试的时候 发现runtime.g0和runtime.m0 在一开始就有值了 那这个是什么时候复值的?刚开始的g0主要负责什么呀

写回答

1回答

Xargin

2021-06-10

m0 默认是个全局变量,内部字段默认就是 0 值,在初始化过程中会逐渐填充这个 m0 的各种字段,比如 schedinit 里的 procresize 会给他绑定 P,initsig 会给他初始化 gsignal 等等,其实最终效果就是让 m0 和程序启动的主线程给对上,m0.g0 用程序的主线程栈


m0 的 g0 和其它 m 的 g0 一样,都是执行调度相关代码的时候会切过去,

比如 runtime 里的 systemstack、mcall 之类的会有栈切换


最开始的 g0 应该也是执行 schedule 函数代码的时候会用到

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程