Let’s Summarize #
GMP调度模型中,每个P的local queue长度为256,创建g时,如果p的local queue满了,就会往global queue里面放了。
为了保证各个P的负载均衡,采用work-stealing调度方式,当一个P上的M要执行一个G时,G从哪里获取呢?
- 尝试从P的local queue获取,没有则走下一步;
- 尝试从global queue获取,没有则走下一步;
- 尝试从netpoller获取,没有则走下一步;
- 尝试从其他P的local queue中获取,没有就真的没有了;
如果真的没有,就要考虑idleM、idleP的处理了。
ps:系统调用阻塞的goroutine恢复执行时,会将其加入到global queue中,因此其可能破坏了原来的GMP之间的调度粘性,可能在不同的P上由不同的M来执行。