GMP调度中关于M没有阻塞而是因为cpu时间片被耗尽这种情况下,g、m、p 三者的状态和流程是什么样?

在 GMP 调度中,当M因系统调用而阻塞时,M会和P解绑,然后 M 和 G 进入阻塞。
可是如果 M 是因为时间片耗尽,从运行状态变成就绪状态,此时的 M 会和 P解绑吗?

最佳答案

耗尽了解绑也没用啊

1个月前 评论
yogurt1024 (楼主) 1个月前
mengxin666 (作者) 1个月前
yogurt1024 (楼主) 1个月前
讨论数量: 7

推荐看看这个:www.yuque.com/aceld/golang/srxd6d

1个月前 评论
yogurt1024 (楼主) 1个月前

耗尽了解绑也没用啊

1个月前 评论
yogurt1024 (楼主) 1个月前
mengxin666 (作者) 1个月前
yogurt1024 (楼主) 1个月前
yourself

不知道我这个理解对不对,仅供参考。

G未执行前存在P里,M和P进行绑定,M从P中获取G,最终M和G绑定后执行。

例:
M1 和 P1绑定,M1获取P1中的G来进行消费,此时M1出现了系统调用,阻塞住了M1。

如果此时M1不和P1解绑,那么P1中的G不会被继续消费,因为P1M1绑定,P只能同时和1M存在绑定关系,所以这个时候后面的G任务都会被阻塞掉,这显然是不合理的。

所以M长时间被阻塞了,M肯定会和P解绑,P会和新的M绑定继续消费G。

如果G执行的时间过长,但是又没有耗尽M的时间片,调度器也可能会中断 G 的执行,并将 G 放回到 P 的就绪队列中,以便调度其他G.
`参考抢占是调度`
1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!