知识卡片

队列兼顾公平

普通读书笔记卡 · 1481.a

内容

调度器优先从 P 的 runnext 和本地队列取 G,也会周期性查看全局队列,避免全局任务饥饿。局部性提升缓存效率,周期性公平避免局部队列垄断。

参考来源

- 位置:《Go语言底层原理剖析》第15章《深入协程设计与调度原理》15.5节《调度策略》 - 结论依据:原文说明调度器"先查找每个P局部的运行队列,当获取不到局部运行队列时,再从全局队列中获取",但如果只循环执行局部队列会让全局队列的 G 完全得不到执行,因此"Go语言调度器使用了一种策略:P中每执行61次调度,就需要优先从全局队列中获取一个G",因此可以推出"调度器优先取本地队列(含 runnext),但周期性检查全局队列以避免饥饿"的结论。 - 原始内容:一般的思路是先查找每个P局部的运行队列,当获取不到局部运行队列时,再从全局队列中获取。但是这种方法可能存在一个问题,如果只是循环往复地执行局部运行队列中的G,那么全局队列中的G可能完全不会执行。为了避免这种情况,Go语言调度器使用了一种策略:P中每执行61次调度,就需要优先从全局队列中获取一个G到当前P中,并执行下一个要执行的G。