-
前置知識點: go程序中,任何對系統 API 的調用,都會被 runtime 層攔截來方便調度。
-
go一共有4種阻塞的情況,並且這些阻塞都是可以被runtime檢測到的,runtime檢測到阻塞時就可以進行優化處理。
- blocking syscall (for example opening a file) // 系統調用
- network input // 網絡IO
- channel operations
- primitives in the sync package // 鎖
4種阻塞可以分為兩類:
分類1 (對應情況2,3,4): (只G阻塞,M,P可用的,要利用起來)
1.1 用戶代碼層面的阻塞(channel,鎖), 此時M可以換上其他G繼續執行。
1.2 網絡阻塞 (netpoller實現G網絡阻塞不會導致M被阻塞,僅阻塞G)。
分類2 (對應情況1): (G,M都被阻塞,P可用,要利用起來)
2.1 系統調用(open file)
- 參考
https://www.kancloud.cn/fruitbag/stack_of_gofuny/760985
https://povilasv.me/go-scheduler/
博主和go夜讀分享者的討論記錄
TODO 這2個說法似乎有的矛盾
這里的Go調度時機和同步異步系統調用也提供了一種理解。
- 請教博客作者后,總結如下
系統調用分同步異步,對應兩種處理方法。一種切換G,一種切換M,但是P不會閑着的(不養閑人)。