用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 函数代码的时候会用到
相似问题