关于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
在整理问题的过程中有些问题就已经得到了解决,但还是打算问出来
老师回答地宽泛一点、偏向概念就可以
正在回答
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
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星