Go語言GMP 排程器的原理

2021-10-22 18:33:03 字數 449 閱讀 7093

作業系統中的程式可以往下分解為程序、執行緒和協程。go中,協程被稱為goroutine,被runtime進行排程。

gmp排程中,g代表goroutine,m代表執行緒,p是processor,它包含了執行goroutine的資源,只有當 m 關聯乙個 p 後才能執行 g 。

復用執行緒:

2個體現:1.work stealing,當本執行緒無可執行的g時,嘗試從其它縣城繫結的p偷取g,而不是銷毀執行緒;2.hand off,當本執行緒因為g進行系統呼叫阻塞是,執行緒釋放繫結的p,把p轉移給其它空閒的執行緒執行;

利用並行:

gomaxprocs設定p的數量,當gomaxprocs大於1時,就最多有gomaxprocs個執行緒處於執行狀態,這些執行緒可能分布在多個cpu核上同時執行,使得併發利用並行。

在go中,執行緒是執行goroutine的實體,排程器的功能就是把可執行的goroutine分配到工作執行緒上。

Golang排程器GMP模型

g goroutine 我們所說的協程,為使用者級的輕量級執行緒,每個goroutine物件中的sched儲存著其上下文資訊.go1.11版本預設stack大小為2kb stackmin 2048 建立乙個g物件,然後放到g佇列 等待被執行 func newproc1 fn funcval,argp...

golang排程器原理與GMP模型設計思想

n 1 1.法利 多個cpu 2.出現阻塞的瓶頸 1 1 1.跟多執行緒 多程序模型 異 2.切換協程成本代價昂貴 m n 1.能夠利 多核 2.過於依賴協程排程器的優化和算 法 記憶體佔 kb 量開闢 靈活排程 切換成本低 早期的go的排程器 基本的全域性go佇列和 較傳統的 輪詢利 多個thre...

Golang排程器GMP學習筆記(二)

我們通過 go func 來建立乙個goroutine 有兩個儲存g的佇列,乙個是區域性排程器p的本地佇列 乙個是全域性g佇列。新建立的g會先儲存在p的本地佇列中,如果p的本地佇列已經滿了就會儲存在全域性的佇列中 g只能執行在m中,乙個m必須持有乙個p,m與p是1 1的關係。m會從p的本地佇列彈出乙...