GMP模型是Go語言運行時系統的一部分,它定義了Go程式中的goroutine、處理器(processor,簡稱P)和核心執行緒(machine,簡稱M)之間的關係和互動方式。GMP模型的目標是提高程式的並行計算性能。
G 代表 goroutine,即Go語言中的輕量級執行緒或協程。
M 代表 worker thread 或 machine,是指實際的作業系統執行緒。
P 代表 processor,是Go邏輯處理器,用於執行Go代碼的資源單位。
GMP模型中的關鍵概念包括:
全局佇列:存放等待運行的G。
P的本地佇列:存放等待運行的G,數量限制不超過256G。
P列表:程式啟動時創建,最多有GOMAXPROCS個(可配置)。
M列表:當前作業系統分配到當前Go程式的核心執行緒數。
P和M的數量:P的數量由環境變數`$GOMAXPROCS`或程式中通過`runtime.GOMAXPROCS()`設定。M的數量受限於Go語言設定的最大量10000,但可以通過`runtime/debug`包中的`SetMaxThreads`函式來設定。
運行佇列:包括全局佇列(GRQ)和私有佇列(LRQ),其中全局佇列上的G還沒有分配到具體的P。
GMP模型支持任務竊取機制,當一個處理器空閒時,它可以竊取其他處理器的工作佇列中的goroutine進行處理,以實現負載均衡。此外,調度模型還支持動態調整處理器數量的功能,以適應程式負載的變化,從而提高計算資源的利用效率。