Go语言将线程抽象成M(Machine),每个M都是可以独立运行的单元,M的数据结构中主要包含的是跟系统环境相关的字段。
Go语言将可执行的上下文保存在G(Goroutine)中,G的数据结构中主要包含跟执行环境相关的字段,包括寄存器值,栈地址、defer,panic的指针等等。
在《Golang深度解读:g0》中,简单讲述了g0的基本信息和在调度中所负责的工作。最先了解g0,主要原因是g0才是真正意义上在线程上运行的逻辑,M在创建之后,系统环境相关的数据保存在M中,线程的执行数据保存在g0中,g0与普通用户协程共用相同的数据结构和计算逻辑,只是在内核调度过程中,需要区分g0与用户协程的部分边界。
worker m
runtime.GOMAXPROCS()
runtime.wakep()runtime.startm()runtime.newm()
runtime.newm()runtime.newosproc()pthread_createCreateThreadruntime.mstart()
m0
runtime.mstart()
main()runtime.rt0_go()runtime.main()runtime.newproc()runtime.mstart()
runtime.main()main.main()
注:m0也是正常的Worker M,只不过创建的流程不太一样
sysmon
Go语言中除了负责执行用户协程的的一组Worker M之外,还有一个独立的监控M,称之为sysmon。
systemstack(func() {
newm(sysmon, nil, -1)
})
runtime.main()runtime.main()
template thread
runtime.newm()
runtime.startTemplateThread()runtime.main()runtime.startTemplateThread()runtime.LockOSThread()