Go 的调度机制了解过吗?
Go 的调度机制了解过吗?
提示
题眼: 参照操作系统里的进程调度知识。
Go 运行时现在采用的是抢占式调度,而不是早期那种更偏协作式的方式。
它的核心目标是:
- 避免某个 goroutine 长时间独占 CPU。
- 提高调度公平性。
- 让大量 goroutine 可以更平滑地切换执行。
当前常见的调度手段包括:
- 编译器在函数调用点插入抢占检查。
- 运行时通过
sysmon监控长时间运行的 goroutine。 - 必要时发送抢占信号,让当前 goroutine 让出执行权。
重要
参考答案:
Go 现在的调度机制可以理解成一种带抢占能力的协程调度。早期 Go 更偏向协作式调度,也就是 goroutine 只有在某些特定点上才会主动让出执行权,这样容易出现不公平甚至饥饿的问题。
后面 Go 引入了更完善的抢占式调度,尤其是 1.14 之后,异步抢占能力更强。现在运行时会通过编译期插桩和后台监控线程 sysmon 配合工作,如果某个 goroutine 连续运行太久,就可能被要求让出 CPU。
它的思路和操作系统里的时间片轮转有点像,只不过调度对象从线程变成了更轻量的 goroutine。
相关信息
引申: 你还了解哪些调度机制?
