Golang是單線程模型還是多線程模型?

雅勳


直接的回答是:Golang是基於多線程模型的。

Golang有一個環境變量GOMAXPROCS,決定了Go運行庫最多會啟動幾個線程來運行goroutine。


但在Golang中沒有線程的概念,用的是協程,即goroutine。


先看一下進程、線程、協程這幾個概念:


進程:分配完整獨立的地址空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程的切換隻發生在內核態,由操作系統調度。


線程:和其它本進程的線程共享地址空間,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程的切換一般也由操作系統調度。



協程:和線程類似,共享堆,不共享棧,協程的切換由Go的調度器來進行調度。


所以,一個Go程序是一個進程,進程裡有數個線程,進程裡還有數個協程,一個或幾個協程對應一個線程。


講解GO線程模型的一般用這樣幾個符號:

M: OS線程

P: goroutin所必須的上下文環境

G: goroutin

調度器:

管理和調度 M, P, G


從關係上可以看下圖:

一個OS線程和一個上下文綁定,一個上下文可以掛幾個協程,由Go調度器來分配、調度他們。


分享到:


相關文章: