Go調度器如何處理goroutine阻塞的情況?


  • 前置知識點: go程序中,任何對系統 API 的調用,都會被 runtime 層攔截來方便調度。

  • go一共有4種阻塞的情況,並且這些阻塞都是可以被runtime檢測到的,runtime檢測到阻塞時就可以進行優化處理。

  1. blocking syscall (for example opening a file) // 系統調用
  2. network input // 網絡IO
  3. channel operations
  4. 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)

TODO 這2個說法似乎有的矛盾

這里的Go調度時機和同步異步系統調用也提供了一種理解。

https://www.cnblogs.com/qcrao-2018/p/11442998.html

  • 請教博客作者后,總結如下
    系統調用分同步異步,對應兩種處理方法。一種切換G,一種切換M,但是P不會閑着的(不養閑人)。


免責聲明!

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



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