GMP 的 work stealing 和 hand off 机制
GMP 的 work stealing 和 hand off 机制
提示
题眼: 背会即可。
work stealing 指的是工作窃取。
当某个 P 的本地运行队列空了,而且全局队列里也没有合适的任务时,它会尝试从其他 P 的本地队列中偷一部分 goroutine 过来执行。这样可以平衡不同处理器之间的负载,避免有的忙、有的闲。
hand off 指的是任务转交。
当某个 M 因为系统调用或其他阻塞原因卡住时,它原本绑定的 P 会尽量和它解绑,再去寻找其他空闲的 M 继续执行队列中的 goroutine。这样可以避免调度资源跟着阻塞线程一起闲置。
重要
参考答案:
工作窃取很好理解,就是某个 P 手里已经没活了,它就会去其他 P 的本地队列里偷一部分 goroutine 过来执行。这样可以提高 CPU 利用率,也能让多个处理器的负载更均衡。
任务转交则主要出现在阻塞场景里。比如某个 goroutine 执行系统调用导致当前 M 被阻塞了,这时候 P 不会一直傻等,而是会尽量和这个阻塞的 M 解绑定,再去找别的空闲 M 接着跑任务。
一个负责解决“活分配不均”,一个负责解决“线程阻塞导致资源闲置”,它们都是 GMP 提高调度效率的重要机制。
相关信息
引申: 如果 P 的本地队列没有任务了,会发生什么?如果某个 goroutine 阻塞了会发生什么?
