怎么保持cpu一直不被协程占用?满足什么条件会退出?通过什么方式切换? goroutine支持信号抢占式机制,一个goroutine不会一直占用cpu,在执行超过一段时间后让出。 每个系统级线程m在初始化时,会注册一个可以接收sigurg信号的handler,这个sigurg信号由sysmon的监视器发出,sysmon单独占用了一个系统级线程m,sysmon每隔一段时间会检测goroutine是否执行超过10ms或是否执行gc,如果满足条件就会给对应线程发送sigurg信号,对应的handler开始执行,并给正在执行的协程打上标识,在检查当前栈是否溢出的地方判断,符合条件后线程会保存协程g的上下文,这样如果下次这个协程仍被这个线程执行,就可以恢复到上次执行的位置。当前协程会被丢弃到全局队列中,同时线程执行下一个协程。 参考链接:https://juejin.cn/post/6972893426425528357

相关推荐

牛客网
牛客企业服务