Go 是协作式调度,还是抢占式调度?

2023-03-28 11:15:51 +08:00
 Jianzs

首先,介绍我对 GoLang 调度过程的认识,如果有误,请指出。

GoLang 的调度模型是 GMP 调度模型,调度的计算实体是 Goroutine ,调度的资源载体是 Machine (线程)。用户创建的 Goroutine 会被提交至 Processor ,Processor 会根据当前空闲与否决定将 Goroutine 是否调度到一个线程执行,当 Processor 上当前线程执行的 Goroutine 结束或挂起时,则会调度新的 Goroutine 至某线程。

接下来,介绍我的疑惑:

从以上两方面,感觉 Go 既有协作式?又有抢占式?但是为什么大家都说 Go 是协作式呢?

站内大佬颇多,还请解惑~

4532 次点击
所在节点    Go 编程语言
21 条回复
bruce0
2023-03-28 21:05:17 +08:00
@jdz 我记得抢占式是有意义的, 协作式是在函数调用时,检查是否让出执行, 就会出现一种情况

```
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
}
}()
time.Sleep(time.Millisecond)
println("OK")
}
```
这段代码在 go1.14 之前不会打印 OK 的 就是因为协程中没有函数调用,也就没有协作式的检查点, 协程就不会退出

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/927783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX