Skip to content

sysmon

sysmon是一個普通的函數,直譯為系統監控,去掉注釋部分也就 200 來行代碼。它會在程序引導階段時被分配一個單獨的線程來啟動,之後會在後台不斷地監控 Go 程序運行時的狀態,並作出相應的處理。關於它啟動這部分的代碼可以在runtime.main函數中查看到:

go
func main() {
    ...
  mp := getg().m
  mainStarted = true
  systemstack(func() {
        newm(sysmon, nil, -1)
    })
    ...
}

系統監控本身只是一個for循環,每一輪循環的間隔時間為 20 微秒,隨著程序空閒指數的上升,間隔時間最多會提升至 10 毫秒。在每一輪循環中,它主要做了下面幾件事情:

  • 輔助協程調度,搶佔長時間運行的協程
  • 檢查內存情況,並判斷是否需要進行垃圾回收

Golang學習網由www.golangdev.cn整理維護