Go抢占式调度
2.6 抢占式调度
2.6.0 sysmon监听抢占时机
sysmon是一个Go里面的一个特殊的线程,不与任何P绑定,不参与调度,主要用于监控整个Go进程,主要有如下作用:
释放闲置超过5分钟的span物理内存
超过2分钟没有垃圾回收,强制启动垃圾回收
将长时间没有处理的netpoll结果添加到任务队列
向长时间执行的G任务发起抢占调度
收回因syscall而长时间阻塞的P
sysmon线程在runtime.main函数里面创建:
123456789101112func main() { ... if GOARCH != "wasm" { // no threads on wasm yet, so no sysmon // 启动sysmon的代码 // 在系统栈内生成一个新的M来启动sysmon atomic.Store(&sched.sysmonStarting, 1) systemstack(func() { newm(sysmon, nil, ...