記錄下對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排程器