天天看點

Go語言GPM設計思想

        GMP,是三個組建的縮寫,即Goroutine(協程),Processor(任務處理器)和Machine(線程)。三者互相協調,共同完成任務排程。Processor是協程和線程之間的橋梁,如果某個線程想要運作Goroutine任務,必須先通路Processor,通過Processor擷取Goroutine任務隊列,最終使得某個Goroutine得到執行。

       整個GPM設計架構如圖所示。

Go語言GPM設計思想
  1. 全局隊列中包含所有排隊的Goroutine任務。
  2. G指單個Goroutine任務。
  3. Processor隊列是配置設定好的排隊中的Goroutine任務,且每個Processor隊列最多不超過256個任務。所有新建立的Goroutine任務都會先嘗試加入Processor隊列中。若一個Processor隊列滿了,則會把該隊列中一般的Goroutine任務移動至全局隊列中。
  4. P指Processor,所有Processor在程式啟動時被建立,并被儲存在數組中。開發者可以通過runtime包中的GOMAXPROCS()函數配置Processor總個數。
  5. M指Machine,是核心線程。核心線程會先嘗試從Processor隊列中擷取單個Goroutine任務,并執行該任務。當Processor隊列為空時,核心線程會嘗試從全局隊列中擷取若幹個Goroutine任務并添加到該Processor隊列中,或者嘗試從其他Processor隊列中擷取一半數量的Goroutine任務并添加到該Processor隊列中,然後擷取單個Goroutine任務,并執行該任務。在任務被執行後,重複上述操作。核心線程的個數預設為10000,但是由于核心很難達到這麼多的線程數量,是以該值意義不大。

繼續閱讀