sysmon
大约 1 分钟
sysmon
sysmon
是一个普通的函数,直译为系统监控,去掉注释部分也就200来行代码。它会在程序引导阶段时被分配一个单独的线程来启动,之后会在后台不断地监控Go程序运行时的状态,并作出相应的处理。关于它启动这部分的代码可以在runtime.main
函数中查看到:
func main() {
...
mp := getg().m
mainStarted = true
systemstack(func() {
newm(sysmon, nil, -1)
})
...
}
系统监控本身只是一个for
循环,每一轮循环的间隔时间为20微秒,随着程序空闲指数的上升,间隔时间最多会提升至10毫秒。在每一轮循环中,它主要做了下面几件事情:
- 辅助协程调度,抢占长时间运行的协程
- 检查内存情况,并判断是否需要进行垃圾回收