Golang實現高並發的調度模型---MPG模式
傳統的並發形式:多線程共享內存,這也是Java、C#或者C++等語言中的多線程開發的常規方法,其實golang語言也支持這種傳統模式,另外一種是Go語言特有的,也是Go語言推薦的:
CSP(communicating sequential processes)並發模型。不同於傳統的多線程通過共享內存來通信,CSP講究的是“以通信的方式來共享內存”。 “不要以共享內存的方式來通信,相反,要通過通信來共享內存。”
go語言使用MPG模式來實現CSP :
在傳統的並發中起很多線程只會加大CPU和內存的開銷,太多的線程會大量的消耗計算機硬件資源,造成並發量的瓶頸。
M指的是Machine,一個M直接關聯了一個內核線程。
P指的是”processor”,代表了M所需的上下文環境,也是處理用戶級代碼邏輯的處理器。
G指的是Goroutine,其實本質上也是一種輕量級的線程。
理解:
M關聯了一個內核線程,通過調度器P(上下文)的調度,可以連接1個或者多個G,相當於把一個內核線程切分成了了N個用戶線程;
M和P是一對一關系(但是實際調度中關系多變),通過P調度N個G(P和G是一對多關系),實現內核線程和G的多對多關系(M:N),通過這個方式,一個內核線程就可以起N個Goroutine,同樣硬件配置的機器可用的用戶線程就成幾何級增長,並發性大幅提高。