记录下对goroutine的理解,看了一些go的源码,goroutine并不能被称协程,它是可以管理多线程的,
先解释下面图中GPM模型
G(G1,G2 …) : 当前的任务(当前排队中的任务)
M: 对应操作系统层面的线程
P: 可以定义P的数量,每个P对应管理着一个M
先不管goroutine是从哪里来的,现在权当它是被go func(第二个goroutine,或者第n个)显示调用来的,
1.生成一个任务
2.它可能是G…Gn,正在执行,或者在排队
3.它被执行时,P把G给到M,再由M执行
任务分配不均时,P会自动去全局队列获取一部分的G,此时其它P发现自己的G比全局队列的多时,会把自己的G再分一部分到全局队列
接下来找一找第一个g0是怎么来的,
${GOROOT}/src/asm_amd64.c
TEXT runtime·rt0_go(SB),NOSPLIT,$0
// copy arguments forward on an even stack
MOVQ DI, AX // argc
MOVQ SI, BX // argv
SUBQ $(4*8+7), SP // 2args 2auto
ANDQ $~15, SP
MOVQ AX, 16(SP)
MOVQ BX, 24(SP)
// create istack out of the given (operating system) stack.
// _cgo_init may update stackguard.
MOVQ $runtime·g0(SB), DI
.....
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)
g0生成先准备工作,初始化内存管理,拉圾回收,再根据参数生成go调度器