关于从当前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

  1. 因为执行函数会改变 goroutine 的栈,调度指令执行的时候不能影响用户的栈,所以要切

  2. tls 是 thread local storage,在 Go 语言里,tls 用来保存当前线程正在执行的 g 的地址。具体实现得看 arch_prctl 这个 linux 的系统调用(用到了 FS 寄存器),在 linux 以外的平台,可能实现不一样。

  3. g 栈在切换的过程中,原来的 g 会保存在 g.sched 字段里,是个 gobuf 结构,你得看看 gobuf 的字段,原来的栈没销毁。只是现在执行栈跑去 g0 了而以。


如果你想看切换的具体逻辑,需要有汇编基础,看 runtime·systemstack

0

Go高级工程师实战营

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

458 学习 · 266 问题

查看课程