go語言中GPM的簡單理解


參考:https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/,本文說明了GPM的發展,以及調度的過程,下面記錄我自己的所思和疑慮

一,GPM各個的意思和作用

  • G: 表示goroutine,存儲了goroutine的執行stack信息、goroutine狀態以及goroutine的任務函數等;另外G對象是可以重用的。
  • P: 表示邏輯processor,P的數量決定了系統內最大可並行的G的數量(前提:系統的物理cpu核數>=P的數量);P的最大作用還是其擁有的各種G對象隊列、鏈表、一些cache和狀態。
  • M: M代表着真正的執行計算資源。在綁定有效的p后,進入schedule循環;而schedule循環的機制大致是從各種隊列、p的本地隊列中獲取G,切換到G的執行棧上並執行G的函數,調用goexit做清理工作並回到m,如此反復。M並不保留G狀態,這是G可以跨M調度的基礎。

二、GPM之間的配合作用

1)G的出現

新創建一個goroutine(G)時會,檢查是否有閑置的p(p的數量是根據cpu中的線程決定的,比如雙核四線程,就可以認為是p最大數量可以為4),若有,則將G添加到已經綁定好的P和M中的P的G隊列中,等待被調度。

  • 問題1,P和M是如何綁定的
  • 問題2,如果沒有了閑置的P,那么G放入到哪個P的隊列中

2)G的調度其實是一種搶占式的調度。(飢餓游戲-搶)

當程序啟動后,會存在一個sysmon線程(監控線程),屬於制定規矩的超級管理者,它會一直存在而且不會受控於GPM規則。當它檢查所有的G時,發現某個G運行時間已經很長了(time=10ms),那么sysmon就對該G進行留校察看處分將其標志位置為true,表示該G在下次調用函數時就會被其他的G(已經在隊列中等了很久了)搶占,讓出對應的M供新的G進行調用

  • 問題1,被搶占的G是否是又被重新放到其所在的隊列中

3)GPM之間的關系圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM