严格来说 goroutine 不能从字面层来翻译称之为协程,它实际上是一套相对完整的虚拟机。
goroutine 模型
Go 语言的 goroutine 模型相对来说设计的不错,goroutine 模型使用的是多对多模型。多对多模型被一些操作系统一些语言 Rust、Java 抛弃,而改用一对一模型,因为一对一模型性能高,但是对于海量的并发操作未必是最优秀的。
Go 语言更适合 IO 密集型,对 CPU 密集型来说它对运行时调度不是很合理,它对 CPU 密集计算上不是很好,但是在 IO 密集上做的很好。
PMG 模型
调度器最根本的任务就是让多个 goroutine 执行。第一确保 goroutine 能执行,第二确保 goroutine 尽可能快执行,第三确保多个 goroutine 之间公平性。
我们抛开硬件只说基本架构,goroutine 本身是基于并发设计的。如果它是虚拟机的话,它首先需要处理器,处理器决定了同时可以运行任务的数量。其次需要并发任务。最后需要具体执行机构,进程的执行机构是线程,在这里把线程抽象出线程。因为运行时是单进程,所以不需要额外的任务调度,三种机构基本可以完成。
我们用一个示意图,PMG 模型代表处理器来控制并发,线程负责具体执行ÿ