【編者的話】雖然已經(jīng)有很多解釋goroutine的優(yōu)秀文章姻几,但是對于初學者來說宜狐,大多都比較晦澀難懂势告,在這里總結(jié)一下自己對goroutine的理解以及相關(guān)資料
Goroutine
Goroutines 既不是OS 線程,也并非Green 線程
Goroutines是更高層次的coroutines(協(xié)程)抽象
Goroutine是并發(fā)的子程序(函數(shù)抚恒、閉包咱台、方法),它們是nonpreemptive(非搶占式的) - 不能被中斷俭驮。相反回溺,協(xié)程有多個可允許中斷或重入的點。
Go運行時觀察Goroutines的狀態(tài)混萝,當阻塞時自動暫停它們遗遵,當它們非阻塞后又重新開啟。這樣Goroutine就是搶占式的協(xié)程逸嘀,而且只有當它們阻塞時车要。
運行g(shù)oroutines的機制是由M:N調(diào)度器實現(xiàn)的,該調(diào)度器將M個green線程映射到N個OS線上崭倘,然后將Goroutines調(diào)度到green線程上翼岁。
當goroutines多于可用的green線程,調(diào)度器將在可用的線程中處理goroutines的分布確保當某些goroutines阻塞時司光,其他的goroutines依然可以執(zhí)行登澜。
Work Stealing
-
fair scheduling
n個處理器, x個任務:每個處理器分配x/n個任務
Scheduler
- G go協(xié)程
- M OS線程(源代碼中表示machine)
- P context(源代碼中表示processor)
- GOMAXPROCS 控制著有多少context被用于運行時
<待續(xù)>
References: