golang GMP排程模型

2021-10-21 22:57:12 字數 861 閱讀 7549

多程序、多執行緒的問題

多執行緒/程序的壁壘

執行緒占用記憶體:約為4mb

高cpu排程消耗

1:1

n:m

排程器的優化

早期go排程器

弊端

全域性佇列

p的本地佇列

p列表

m列表

p和m的數量

m數量問題

hand off 機制

利用並行

搶占 全域性g佇列

通過go func()建立乙個g

有兩個儲存g的佇列,,乙個是區域性排程器的本地佇列p,乙個是全域性g佇列,新建立的g會先儲存在本地佇列p,若p滿了就會儲存到全域性g佇列

g只能執行在m中,乙個m必須持有乙個p,m會從p的本地佇列彈出乙個可以執行的g執行,若p的本地隊列為空,就會從全域性g佇列或其他mp組合偷取乙個可執行的g來執行

乙個m排程g執行的過程是乙個迴圈機制

當m執行某乙個g時若發生了,syscall或者其他阻塞操作,m會阻塞,若當前有一些g在執行,runtime就會把這個執行緒m從p中摘除(detach),然後建立乙個新的執行緒(若有空閒執行緒則復用)服務於這個p

、當m系統呼叫結束時,這個g會嘗試獲取乙個空閒的p執行,並放入到這個p的本地佇列,若獲取不到p,次執行緒m就會進入休眠狀態,加入到空閒執行緒中,然後這個g會被放入全域性佇列

g0

開啟trace

關閉trace

go build且執行後會得到trace.out檔案

通過go tool trace工具開啟trace檔案

通過debug trace檢視gmp資訊,godebug=schedtrace=1000 ./可執行程式

Golang GMP排程模型

processor的數量是在啟動時被設定為環境變數gomaxprocs的值,或者通過執行時排程函式gomaxprocs 進行設定。processor數量固定意味著任意時刻只有gomaxprocs個執行緒在執行著go 我們分別用三角形,矩形和圓形表示machine processor和goroutin...

排程佇列模型

排程佇列模型及準則 1 僅有程序排程的排程佇列模型 每個程序在執行時都可能出現以下三種情況 1 任務在給定的時間片內已經完成,該程序便在釋放處理機後進入完成狀態 2 任務在本次分得的時間片內尚未完成,os便將該任務再放入就緒佇列的末尾 3 在執行期間,程序因為某事件而被阻塞後,被os放入阻塞佇列。2...

Goroutine的排程模型

當前有兩個p,各自繫結了乙個m,每個p上掛了乙個本地goroutine佇列,也有乙個全域性goroutine佇列。流程 每次使用go關鍵字宣告時,乙個g物件被建立並加入到本地g佇列或者全域性g佇列。檢查是否有空閒的p 處理器 若有那麼建立乙個m 若有正在sleep的m那麼直接喚醒它 與其繫結,然後這...