Go 为什么不怕 goroutine 死循环:抢占不是玄学,是一套停机协议
把 GOMAXPROCS 设成 1,再启动一个没有函数调用、没有 I/O、没有 sleep 的死循环。
按很多人对 goroutine 的理解,程序应该完了:唯一的 P 被这个 goroutine 一直占着,其他 goroutine 没机会 …
把 GOMAXPROCS 设成 1,再启动一个没有函数调用、没有 I/O、没有 sleep 的死循环。
按很多人对 goroutine 的理解,程序应该完了:唯一的 P 被这个 goroutine 一直占着,其他 goroutine 没机会 …
把 GOMAXPROCS 设成 1,再让一个 goroutine 卡在 syscall.Read 里。
按直觉,整个 Go 程序应该只剩一个执行名额。这个名额被卡住了,其他 goroutine 也该一起停。
但你真跑一下,会看到另一件事 …
很多人聊 Go 调度器,开口就能背:G 是 goroutine,M 是 machine,P 是 processor。
背完以后,问题来了:为什么已经有 M 这个 OS 线程,还要多一个 P?
如果这个问题答不上来,GMP 其实还没真的理解。 …