关于从当前m运行的g栈上切换到g0栈上的问题
来源:1-6 Go 语法背后的秘密
Garry_27
2021-05-21 22:03:58
1、为什么源码中很多关键的的地方(执行调度,创建g)都是在m的g0的栈上运行。
2、怎么理解tls他是干嘛用的。在m中他的作用是什么
3、g栈在切换过程中,原来的栈是只是保存了必要信息然后将整个栈空间销毁吗
1回答
Xargin
2021-05-21
因为执行函数会改变 goroutine 的栈,调度指令执行的时候不能影响用户的栈,所以要切
tls 是 thread local storage,在 Go 语言里,tls 用来保存当前线程正在执行的 g 的地址。具体实现得看 arch_prctl 这个 linux 的系统调用(用到了 FS 寄存器),在 linux 以外的平台,可能实现不一样。
g 栈在切换的过程中,原来的 g 会保存在 g.sched 字段里,是个 gobuf 结构,你得看看 gobuf 的字段,原来的栈没销毁。只是现在执行栈跑去 g0 了而以。
如果你想看切换的具体逻辑,需要有汇编基础,看 runtime·systemstack
相似问题