Golang调度器( 二 )


文章插图
 
任务窃取任务窃取作用是平衡P之间的负载,如果某个P上的G都执行完了,此时会检查其他P上有没有可执行的G,如果有则会窃取其他P上的G来执行 。
图7中,有两个P,每个P上有4个G,全局队列中也有一个G 。

Golang调度器

文章插图
 
图8中,P1上的G全部执行完了,但是P2和全局队列上还有G待执行 。此时P1需要窃取其他G来执行,窃取规则和调度规则是一样的参考上面的 runtime.schedule。
Golang调度器

文章插图
 
图9中,根据窃取规则,P1会将P2上一半的G窃取过来执行 。
Golang调度器

文章插图
 
图10中,如果此时P2上的G都执行完了,并且P1的本地队列中也没有G了会怎么办?
Golang调度器

文章插图
 
图11中,P2上的G都执行完,它要开始窃取任务,但是P1上也没有G了,根据窃取规则他会把全局队列上的G拿过来执行 。
Golang调度器

文章插图
 
参考这篇文章基本上是翻译下面的文章,然后加了一些自己的理解 。




推荐阅读