sysmon
sysmon是一個普通的函數,直譯為系統監控,去掉注釋部分也就 200 來行代碼。它會在程序引導階段時被分配一個單獨的線程來啟動,之後會在後台不斷地監控 Go 程序運行時的狀態,並作出相應的處理。關於它啟動這部分的代碼可以在runtime.main函數中查看到:
go
func main() {
...
mp := getg().m
mainStarted = true
systemstack(func() {
newm(sysmon, nil, -1)
})
...
}系統監控本身只是一個for循環,每一輪循環的間隔時間為 20 微秒,隨著程序空閒指數的上升,間隔時間最多會提升至 10 毫秒。在每一輪循環中,它主要做了下面幾件事情:
- 輔助協程調度,搶佔長時間運行的協程
- 檢查內存情況,並判斷是否需要進行垃圾回收
