Golang—— GMP模型发展(一)
一、前言
Golang语言的关键点之一:协程;相对于线程而言,协程是一个更轻量级的线程。在讲到协程的时候,不可避免的要讲到GMP模型,而GMP模型的前身是GM模型。
二、GM与GMP
Go1.1版本(2012年)之前用的都是GM模型,但是由于GM模型性能不好,之后官方对调度器进行了改进,演化为现在的GMP模型。
GM模型
GM模型中的G全称为Goroutine协程,M全称为Machine内核级线程,其调度过程如下:
M(内核级线程)从加锁的Goroutine队列中获取G(协程)执行,如果G在运行过程中创建了新的G,那么新的G也会被放在全局队列中。
基于以上设计存在两个不足之处:
调度,返回G都需要获取队列锁,形成了激烈竞争。M转移G没有把资源最大化利用。比如当M1在执行G1时,M1创建了G2,为了继续执行G1,则需要把G2交给M2执行,因为G1和G2是相关的,而寄存器中会保存G1的信息,因此G2最好是放在M1上执行,而不是其他M。
GMP模型
GMP模型是在GM模型基础上增加了一个P层。
G:goroutine,协程
共有 0 条评论