天天看點

go goroutine排程

記錄下對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再分一部分到全局隊列

go goroutine排程

接下來找一找第一個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排程器

繼續閱讀