目录
参考及引用
目录
Go抢占式调度
详细请看引用4
基于协作的抢占式调度
它使得所有的goroutine在函数调用时都有机会进入运行时检查是否需要执行抢占,通过以下特性实现
- runtime: add stackguard0 to G
- 为 Goroutine 引入
stackguard0
字段,该字段被设置成StackPreempt
意味着当前 Goroutine 发出了抢占请求;
- 为 Goroutine 引入
- runtime: introduce preemption function (not used for now)
- 引入抢占函数 runtime.preemptone:1e112cd 和 runtime.preemptall:1e112cd,这两个函数会改变 Goroutine 的
stackguard0
字段发出抢占请求; - 定义抢占请求
StackPreempt
;
- 引入抢占函数 runtime.preemptone:1e112cd 和 runtime.preemptall:1e112cd,这两个函数会改变 Goroutine 的
- runtime: preempt goroutines for GC
- 在 runtime.stoptheworld:1e112cd 中调用 runtime.preemptall:1e112cd 设置所有处理器上正在运行的 Goroutine 的
stackguard0
为StackPreempt
; - 在 runtime.newstack:1e112cd 中增加抢占的代码,当
stackguard0
等于StackPreempt
时触发调度器抢占让出线程;
- 在 runtime.stoptheworld:1e112cd 中调用 runtime.preemptall:1e112cd 设置所有处理器上正在运行的 Goroutine 的
- runtime: preempt long-running goroutines
- 在系统监控中,如果一个 Goroutine 的运行时间超过 10ms,就会调用 runtime.retake:1e112cd 和 runtime.preemptone:1e112cd;
- runtime: more reliable preemption
- 修复 Goroutine 因为周期性执行非阻塞的 CGO 或者系统调用不