首先,介绍我对 GoLang 调度过程的认识,如果有误,请指出。
GoLang 的调度模型是 GMP 调度模型,调度的计算实体是 Goroutine ,调度的资源载体是 Machine (线程)。用户创建的 Goroutine 会被提交至 Processor ,Processor 会根据当前空闲与否决定将 Goroutine 是否调度到一个线程执行,当 Processor 上当前线程执行的 Goroutine 结束或挂起时,则会调度新的 Goroutine 至某线程。
接下来,介绍我的疑惑:
- 一方面,当协程退出或 IO 阻塞时主动让出占用的计算资源,供其他 Goroutine 使用,这是典型的协作式调度。
- 另一方面,当一个协程长时间占用计算资源,runtime 会将其强制中断,进而让其他 Goroutine 都能有机会得到执行,这应该是抢占式调度。
从以上两方面,感觉 Go 既有协作式?又有抢占式?但是为什么大家都说 Go 是协作式呢?
站内大佬颇多,还请解惑~