栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang之gmp调度模型

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang之gmp调度模型

原始调度模型

我们把线程分为内核级线程和用户态线程,内核级的线程在切换线程时,开销比较大,需要系统调用,但是,用户态线程不是这样,用户态的线程之间的切换不需要系统调用,从而把切换的开销比较小。

golang开始并没有使用gmp调度模型,只有gm。
也就是说没有局部队列,每一个m执行完一个g之后,从全局队列中拿到一个g运行,这样的结果就是每一个m从全局队列中拿取g时,都要对全局队列加锁。这也是导致原始调度模型效率低的一个原因。

GMP调度模型

G:goroutine ,协程,用户态线程
M:thread,对应内核级线程
P:Processor,处理器

GMP调度模型也有全局队列,只不过M先到P的本地队列中拿取协程。

  • 全局队列:保存待执行的线程
  • 局部队列:和全局队列相似,保存待执行的线程,但是M会优先从局部队列中拿取协程
  • P列表:在程序运行时创建,保存在数组中,最多有GoMaxProcs,可配置个。
  • M:执行任务之前要获取任务,在获取任务之前要绑定一个P,从P的局部队列中拿取任务,当P的任务为空时,会从全局队列中拿取一个或者一批任务到局部队列,或者从其他局部队列中偷取任务放到自己的局部队列。

当调度的协程发生系统调用阻塞时,p和m解绑,p会寻找一个新的m或者创建一个新的m。
当系统调用结束之后,g会重新寻找一个空闲的p执行,或者在p的队列中排队,如果p的队列是满的状态,那么放到全局队列中。

m和p何时创建

p的创建:在程序开始时,根据设定的p的最大值进行创建p
m的创建:当p没有对应的m,并且没有休眠的m时,会创建m

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号