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

2021-10-09 08:18:37 字數 478 閱讀 9459

我們通過 go func()來建立乙個goroutine;

有兩個儲存g的佇列,乙個是區域性排程器p的本地佇列、乙個是全域性g佇列。新建立的g會先儲存在p的本地佇列中,如果p的本地佇列已經滿了就會儲存在全域性的佇列中;

g只能執行在m中,乙個m必須持有乙個p,m與p是1:1的關係。m會從p的本地佇列彈出乙個可執行狀態的g來執行,如果p的本地隊列為空,就會想其他的mp組合偷取乙個可執行的g來執行;

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

當m執行某乙個g時候如果發生了syscall或則其餘阻塞操作,m會阻塞,如果當前有一些g在執行,runtime會把這個執行緒m從p中摘除(detach),然後再建立乙個新的作業系統的執行緒(如果有空閒的執行緒可用就復用空閒執行緒)來服務於這個p;

當m系統呼叫結束時候,這個g會嘗試獲取乙個空閒的p執行,並放入到這個p的本地佇列。如果獲取不到p,那麼這個執行緒m變成休眠狀態, 加入到空閒執行緒中,然後這個g會被放入全域性佇列中。

參考:

Golang排程器GMP模型

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

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

單程序時代的問題 多程序 多執行緒的問題 協程的問題m goroutine協程 n thread執行緒 m想要執行 放回g都必須訪問全域性g佇列,並且m有多個,即多執行緒訪問同一資源需要加鎖進行保證互斥 同步,所以全域性g佇列是有互斥鎖進行保護的。問題 建立 銷毀 排程g都需要每個m獲取鎖,這就形成...

深入理解Golang排程器GMP模型

隨著伺服器硬體的公升級,配置越來越高,為了充分利用伺服器資源,併發變成也就變得越來越重要。併發 邏輯上具有處理多個同時任務的能力。並行 物理上同一時刻執行多個併發任務。通常所說的併發程式設計,也就是說它允許多個任務同時執行,但實際上並不一定在同一時刻被執行。在單核處理器上,通過多執行緒共享cpu時間...