关于GMP调度模型的几个问题

关于GMP调度模型的几个问题

在内网上找到几篇关于GMP的文章,关于里面的一些描述我整理了一些疑问。(D作为一大项问题)

虽然有些问题之前解答过,视频中也有,但我还是想再问问。。希望老师不要厌烦。。。

D1: 当M执行某一个goroutine时如果发生了syscall或者其余阻塞操作,M会阻塞,如果当前有一些G在执行,runtime会把这个线程M从P中摘除,然后寻找空闲线程(创建新的线程)来服务这个P。

Q1:这种说法(模型)是否正确?

Q2:其余阻塞操作都有哪些?

Q3:与因执行syscall而阻塞并从P上被摘除的M相关联的G在M发生阻塞时和阻塞结束后状态及所处位置(逻辑位置)的变化是怎样的。


D2:G1运行时向已满channel中写入数据时进入waiting,此时从M上摘除G1,转而从相关联的P中的runQ队列内选择runable的G2进行执行。

Q1:与D1中的syscall相比较,同样都是阻塞操作,有什么不同?

Q2:与D1相比较,为什么D2不需要更换M


在整理问题的过程中有些问题就已经得到了解决,但还是打算问出来

老师回答地宽泛一点、偏向概念就可以

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

D1: 当M执行某一个goroutine时如果发生了syscall或者其余阻塞操作,M会阻塞,如果当前有一些G在执行,runtime会把这个线程M从P中摘除,然后寻找空闲线程(创建新的线程)来服务这个P。

Q1:这种说法(模型)是否正确?

他这里说的比较简单,我 ppt 里说的详细,阻塞分为可接管可不可接管的,syscall 和 cgo 是不可接管的阻塞,这种会占用住这个线程。需要把 P 和 M 剥离开,然后找其它线程。那些可接管的阻塞就直接进各种等待队列了,有人会说这叫 G 和 M 解绑。

Q2:其余阻塞操作都有哪些?

ppt 上比较详细。。六种可接管阻塞和两种不可接管的。不过 cgo 一般用的少,可以不用管。

Q3:与因执行syscall而阻塞并从P上被摘除的M相关联的G在M发生阻塞时和阻塞结束后状态及所处位置(逻辑位置)的变化是怎样的。

阻塞结束后,相当于 syscall 返回,这时候 M 要检查自己是不是还和 P 绑定,如果还绑定,那就继续执行 syscall 返回的逻辑,否则就要让这个 G 进全局队列(因为这个 M 已经没有 P 了,所以没有 local run queue,没有 runnext),这部分代码你感兴趣可以看看 entersyscall 和 exitsyscall

  • 曹大,这里所说的“那些可接管的阻塞就直接进各种等待队列”,这里的等待队列是指全局队列还是本地队列又或是一个单独的队列呢,在源码中没有找到这部分。。。

    2021-06-06 16:56:09
  • Xargin 回复 linxiaoyi #2

    这个不是调度队列,比如 channel,就是 sendq 和 recvq

    这个等待队列是和具体的数据结构相关的

    2021-06-06 21:23:01
Xargin 2021-05-18 18:26:01

D2:G1运行时向已满channel中写入数据时进入waiting,此时从M上摘除G1,转而从相关联的P中的runQ队列内选择runable的G2进行执行。

Q1:与D1中的syscall相比较,同样都是阻塞操作,有什么不同?

ppt 里已经说了。。这种是可以接管的,因为原来在用户视角看来被阻塞的 g,在 runtime 里是塞进某种等待队列里了。syscall 操作要和操作系统交互,必须阻塞住线程等操作系统返回才能继续,所以必须占用线程。

Q2:与D1相比较,为什么D2不需要更换M

因为 M 这时候不需要被占用,自然不需要更换了


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师