1.go func()执行分析
2.调度器的生命周期
M0
M0是启动程序后的编号为0的主线程,M0负责执行初始化操作和启动第一个G(初始化一些队列信息等),在之后M0就和其他的M一样了。
G0
G0
-
runtime创建最初的线程m0和goroutine g0,并把2者关联。
-
调度器初始化:初始化m0、栈、垃圾回收,以及创建和初始化由GOMAXPROCS个P构成的P列表。
-
M0 与main绑定后,和G0分离,处理main函数,如果时间片到了,就把main再次放入本地队列,循环执行,知道main函数panic 或者 exit退出。
3.GMP可视化调试
package main
import (
"os"
"fmt"
"runtime/trace"
)
func main() {
//创建trace文件
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
defer f.Close()
//启动trace goroutine
err = trace.Start(f)
if err != nil {
panic(err)
}
defer trace.Stop()
//main
fmt.Println("Hello World")
}