golang goroutine的調度

一、協程與進程,線程的關係

1.進程:程序的一次執行過程,資源的最小分配單位

進程狀態:

就緒態,運行態,阻塞態

進程調度算法:

1.)FIFO(First Input First Output 先進先出法)、

2.)RR(時間片輪轉算法)

3.)(HPF)最高優先級算法。

進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,由操作系統調度。

2.線程:操作系統的最小調度單位,可併發執行,共享進程資源(相同的地址空間,共享內存,信號量等)

狀態:初始化、可運行、運行中、阻塞、銷燬

線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,由操作系統調度。

3.協程:輕量級線程,完全用戶態控制執行,特殊的函數,降低了調度開銷

協程共享堆,不共享棧,協程由程序員在協程的代碼裏顯示調度。協程需要的棧相比線程小得多,幾kb,避免了過多調度帶來的消耗。

調度:M-P-G模型

G:goroutine受管理的輕量線程

M:machine等同於系統線程

P:process,M運行G需要的資源,每個P會維護一個本地的運行隊列,除了每個P擁有一個本地的運行隊列外,還存在一個全局的運行隊列。個數取決於設置的GOMAXPROCS,默認使用最大內核數。

調度關係圖如下:

   

        M得到P後執行G,取G的順序:本地運行隊列 > 全局運行隊列 > 其他P的運行隊列,如果所有運行隊列都沒有可用的G,M會歸還P並進入休眠。G的數量超出了M的處理能力,並且還有空餘P,runtime就會自動創建新的M;

 M0阻塞時,P會運行M1,M0返回時必須嘗試獲得一個P來運行goruntine,若未獲得P將goruntine放入全局隊列進入休眠。Goruntine阻塞時會發生上下文切換執行如下操作:

 1.)系統調用。

 2.)讀寫channel。

 3.)gosched主動放棄,會將G扔進全局隊列, M歸還P進入休眠。   

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章