Go如何调度,假设4核的cpu应该有几个线程或者说有几个M,那能有几个groutinue,groutinue数量的上限是多少?

题目来源:京东

答案:

Go的GMP模型中M(Machine)为操作系统线程,这三者交互实际来源于M:N调度模型。也就是M必须与P进行绑定,然后不断地在M上循环寻找可运行的G执行相应的任务。
要知道在协程的执行中,真正干活的是GPM中的M,因为 G 是用户态上的东西,最终执行都是得映射,对应到 M 这一个系统线程上去运行。
在 Go 语言中,M 的默认数量限制是 10000,如果超出则会报错。通常只有在 Goroutine 出现阻塞操作的情况下,才会遇到这种情况。这可能也预示着你的程序有问题。若确切是需要那么多,还可以通过debug.SetMaxThreads 方法进行设置。

那 G 呢,Goroutine 的创建数量是否有限制?
答案是:没有。但理论上会受内存的影响,假设一个 Goroutine 创建需要 4k(注:Goroutine 创建所需申请的 2-4k 是需要连续的内存块。):
4k * 80,000 = 320,000k ≈ 0.3G内存
4k * 1,000,000 = 4,000,000k ≈ 4G内存
以此就可以相对计算出来一台单机在通俗情况下,所能够创建 Goroutine 的大概数量级别。