多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> # GMP 模型 - G是goroutine,P是处理器,M是线程 : 处理器负责调度goroutine到线程上,维护了一个本地队列,存储了所有需要它来调度的G - 创建G, 加入P的本地队列,如果本地队列满了就加入全局G队列 - P从本地队列里取出G, 如果没有, 从全局队列里获取, 如果也没有从其它P里窃取一半G - 调度G执行,一个G最多占用P10ms, 调用阻塞时M会释放P,P绑定空闲的M继续执行 - G 执行完后如果不需要继续执行则销毁, 需要继续执行的放回P的本地队列中, 如果没有绑定的P, 就放到全局队列中。 - (M是线程, 默认初始化10000个,P是处理器, 默认与逻辑CPU数量相等) - (M阻塞时释放P, G阻塞时M未阻塞,放回队列) --- - 协程:协程是轻量级的,上下文切换快, 由用户控制。go里面是GMP模型。G是goroutine。M是线程, 默认初始化10000个,所有的G都要放在M上才能运行。P是处理器, 默认与逻辑CPU数量相等,负责调度G到M上,维护了一个本地队列,存储了所有需要它来调度的G。 - 创建G, 加入P的本地队列,如果本地队列满了就加入全局G队列。 - P从本地队列里取出G, 如果没有, 从全局队列里获取, 如果也没有从其它P里窃取一半G - 调度G执行,一个G最多占用P10ms, 调用阻塞时M会释放P,P绑定空闲的M继续执行 - G 执行完后如果不需要继续执行则销毁, 需要继续执行的放回P的本地队列中, 如果没有绑定的P, 就放到全局队列中。 - (M阻塞时释放P, G阻塞时M未阻塞,放回队列) ### GPM模型的工作原理 GPM模型的调度机制是基于协作式调度和抢占式调度的混合模式,主要工作原理如下: 1. **协作式调度**: * 每个协程在执行一段时间后,会主动让出CPU,进入调度点。调度器会选择下一个准备好的协程来执行。 * 常见的调度点包括函数调用、通道操作、以及阻塞操作(如等待I/O)。 2. **抢占式调度**: * 为了防止某些协程占用CPU时间过长,导致其它协程无法执行,Go运行时还引入了抢占式调度。 * 当一个协程运行时间过长时,调度器会强制中断它的执行,并将其放回队列,让其他协程有机会执行。 3. **工作窃取**: * 为了均衡负载,每个处理器(P)都有一个本地队列,用于存储要执行的协程。 * 当一个处理器完成了它的所有任务,会尝试从其他处理器的队列中窃取任务,以保持系统的高效运行。 > 相关阅读 - [go面试题整理](https://www.jianshu.com/p/93ef12be3ae4) - [go语言GMP(GPM)原理和调度](https://www.cnblogs.com/CJ-cooper/p/15270475.html)