首页 > 编程语言 > 详细

go语言中GPM的简单理解

时间:2020-03-20 12:29:34      阅读:90      评论:0      收藏:0      [点我收藏+]

参考:https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/,本文说明了GPM的发展,以及调度的过程,下面记录我自己的所思和疑虑

一,GPM各个的意思和作用

  • G: 表示goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。
  • P: 表示逻辑processor,P的数量决定了系统内最大可并行的G的数量(前提:系统的物理cpu核数>=P的数量);P的最大作用还是其拥有的各种G对象队列、链表、一些cache和状态。
  • M: M代表着真正的执行计算资源。在绑定有效的p后,进入schedule循环;而schedule循环的机制大致是从各种队列、p的本地队列中获取G,切换到G的执行栈上并执行G的函数,调用goexit做清理工作并回到m,如此反复。M并不保留G状态,这是G可以跨M调度的基础。

二、GPM之间的配合作用

1)G的出现

新创建一个goroutine(G)时会,检查是否有闲置的p(p的数量是根据cpu中的线程决定的,比如双核四线程,就可以认为是p最大数量可以为4),若有,则将G添加到已经绑定好的P和M中的P的G队列中,等待被调度。

  • 问题1,P和M是如何绑定的
  • 问题2,如果没有了闲置的P,那么G放入到哪个P的队列中

2)G的调度其实是一种抢占式的调度。(饥饿游戏-抢)

当程序启动后,会存在一个sysmon线程(监控线程),属于制定规矩的超级管理者,它会一直存在而且不会受控于GPM规则。当它检查所有的G时,发现某个G运行时间已经很长了(time=10ms),那么sysmon就对该G进行留校察看处分将其标志位置为true,表示该G在下次调用函数时就会被其他的G(已经在队列中等了很久了)抢占,让出对应的M供新的G进行调用

  • 问题1,被抢占的G是否是又被重新放到其所在的队列中

3)GPM之间的关系图

技术分享图片

 

go语言中GPM的简单理解

原文:https://www.cnblogs.com/carySir/p/12530133.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!