知识卡片
G0负责调度
内容
每个工作线程都有特殊的 g0,运行在系统线程栈上,专门执行调度、栈切换等运行时代码。用户协程让出执行权时,会切到 g0 再选择下一个 G。
参考来源
- 位置:《Go语言底层原理剖析》第15章《深入协程设计与调度原理》15.2节《特殊协程g0与协程切换》
- 结论依据:原文明确"协程g0运行在操作系统线程栈上,其作用主要是执行协程调度的一系列运行时代码,而一般的协程无差别地用于执行用户代码……很显然,执行用户代码的任何协程都不适合进行全局调度",并说明"在用户协程退出或者被抢占时,意味着需要重新执行协程调度,这时需要从用户协程g切换到协程g0",因此可以推出"每个线程都有专属 g0、专门负责调度而不执行用户代码"的结论。
- 原始内容:协程g0运行在操作系统线程栈上,其作用主要是执行协程调度的一系列运行时代码,而一般的协程无差别地用于执行用户代码。很显然,执行用户代码的任何协程都不适合进行全局调度。在用户协程退出或者被抢占时,意味着需要重新执行协程调度,这时需要从用户协程g切换到协程g0,协程g与协程g0的对应关系如图15-2所示。要注意的是,每个线程的内部都在完成这样的切换与调度循环。