当一个g阻塞在网络io的时候,此时g会离开当前的p到一个netpoll的地方,同时m也与p解绑单独去看守这个g,等到g的网络时间就绪后,这个g是被放回的本地队列还是全局队列?
当一个g阻塞在网络io的时候,此时g会离开当前的p到一个netpoll的地方,同时m也与p解绑单独去看守这个g,等到g的网络时间就绪后,这个g是被放回的本地队列还是全局队列?
问题本身不太准确:go实现的是非阻塞网络IO,当网络事件未就绪时G会与M解绑,挂在某个等待队列,而M并不会去“看守”这个G。事件就绪是通过 runtime.netpoll
来检测感知的,runtime.netpoll
会再 schedule
和 sysmon
中调用。G就绪的话,可能被放在P本地,也可能在全局队列。
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
1 回答1.5k 阅读
g的网络时间就绪后, 首先看守这个g的m会与新的p(空闲)进行绑定, 然后把g放到p的本地队列