m0上只跑g0么 m0会阻塞吗

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

慕尼黑2207807

2021-06-09 21:56:41

m0上只跑g0,那g0上运行的main.main里面如果执行了 time. sleep 那这个m0也只会阻塞在这么 而不是运行其他的g么

写回答

1回答

Xargin

2021-06-09

m0 的 g0 和普通 m 的 g0,都是用来跑调度相关的代码的


m0 在跑用户的代码的时候,也会创建专门的 goroutine:


下面这个是启动过程中的 rt0_go:

// create a new goroutine to start program
MOVQ   $runtime·mainPC(SB), AX       // entry
PUSHQ  AX
PUSHQ  $0       // arg size
CALL   runtime·newproc(SB)
POPQ   AX
POPQ   AX

// start this M
CALL   runtime·mstart(SB)

这里新创建的 goroutine,传入的方法是 runtime.main


这里新启动的就是 m0,m0 通过 mstart 函数,最终进入 schedule,找到启动阶段创建的新的 goroutine(不是g0),这个启动阶段创建的 goroutine 要执行的方法就是 runtime.main


我之前给的答案应该是有点问题,m0 在初始化完毕后,应该和其它线程没啥两样了,都是该阻塞阻塞,该执行调度就执行调度

0

Go高级工程师实战营

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

458 学习 · 266 问题

查看课程