当m在执行某个g的时候,g非常耗时,例如一个for循环,每次循环sleep1分钟,循环1000次。这个例子看似无聊,却是很难解决的,成功的避开了2个系统切换时机。
如果这个时候,一直执行这个g,别的g就会得不到执行,例如有g是处理用户支付的,这样就会造成收钱不积极。协程饥饿问题
如果占用时间过长的这个G,能让出来M,让别的G也能执行,本地队列循环的着执行,就能解决这个问题。全局队列
解决办法,每过一段时间,每个本地队列都先来全局队列中取1个,这样就能解决这个问题。代码实现:
系统runtime里面很多方法有去调用,例如 time.Sleep、channel的等待等系统调用完成时
这个源码在 syscall_aix.go中,因为有好几层函数调用,就不贴出来了。标记抢占 基于 morestack
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |