
上QQ阅读APP看书,第一时间看更新
1.3.8 场景8:M2从M1中偷取
假设G2一直在M1上运行,经过两轮后,M2已经把G7、G4从全局队列获取了P2的本地队列并完成运行,全局队列和P2的本地队列将变为空,如图1.49所示。

图1.47 场景7-2

图1.48 场景7-3
M2又会处于调度G0的状态,此时的M2处于自旋线程状态。处于自旋状态的MP组合会不断地寻找可以调度的G,否则在这空等待就是在浪费线程资源。

图1.49 场景8-1
全局队列已经没有G,所以M就要执行偷取:从其他有G的P那里偷取一半G过来,放到自己的P本地队列。P2从P1的本地队列尾部取一半的G,如图1.50所示。
本例中一半则只有1个G8,所以M2就会尝试将G8偷取过来,放到P2的本地队列,如图1.51所示。

图1.50 场景8-2

图1.51 场景8-3
接下来的过程与之前的场景相似,G0会调度G8,从而M2就不再是自旋线程状态了,如图1.52所示。