1.go func()执行分析

2.调度器的生命周期

M0

M0是启动程序后的编号为0的主线程,M0负责执行初始化操作和启动第一个G(初始化一些队列信息等),在之后M0就和其他的M一样了。

G0

G0
  1. runtime创建最初的线程m0和goroutine g0,并把2者关联。

  2. 调度器初始化:初始化m0、栈、垃圾回收,以及创建和初始化由GOMAXPROCS个P构成的P列表。

  3. 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")
}