协程:轻量级线程,与线程相对,协程不受操作系统调度,协程调度器受用户应用程序操作,协程调度器按照调度策略把协程调度到线程中运行。
Go 语言的协程 goroutine Go 为了提供更容易使用的并发方法,使用了 goroutine 和 channel。goroutine 来自协程的概念,让一组可复用的函数运行在一组线程之上,即使有协程阻塞,该线程的其他协程也可以被 runtime 调度,转移到其他可运行的线程上。
Go 中,协程被称为goroutine,它非常轻量,一个 goroutine 只占几 KB,并且这几 KB 就足够 goroutine运行完,这就能在有限的内存空间内支持大量goroutine,支持了更多的并发。虽然一个 goroutine 的栈只占几 KB,但实际是可伸缩的,如果需要更多内容,runtime 会自动为 goroutine 分配。
Goroutine 特点: 占用内存更小(几 kb) 调度更灵活 (runtime 调度)
Goroutine调度器的GPM模型的设计思想 1)G,M,P对应含义,如下图:
2)GMP模型
关于P和M,G的个数问题 1、G 的数量:
2、P 的数量:
3、M 的数量:
P和M何时被创建
go func()调度流程
从上图我们可以分析出几个结论:
调度器的生命周期
特殊的 M0 和 G0 M0
G0