GMP调度模型

GMP涉及思想:用较少的线程完成大量任务,利用多核并行实现高并发

先聊聊GM模型的问题

  1. 频繁的gorouting切换╯﹏╰后果:额外的开销
  2. 线程缓存与协程所需要的缓存比例差距太大,导致大量的内存浪费
  3. 系统调度会导致工作的线程频繁阻塞与解阻塞
  4.  使用全局互斥锁mutex处理整个gorouting的操作

再来解释GMP模型

     由于GM模型存在的缺陷,导致性能不佳,因此急切的需要一种调度控制器来协调线程与协程

G:等待执行的任务(协程)

M:工作的线程

P:处理器(注意不是cpu)

 三者关系

        一个线程(M)工作时要与一个P进行绑定,假设现在我们启动三个线程和三个处理器

f9818a4d6c784dd58ecc70084a33e4ce.png

         每个处理器都有自己的协程队列

e47ff2f6648043fcbf67d6e285d9900e.png

         当有G(协程任务)需要处理时,会将G加入到P(处理器)的队列中

c64c69954e544ea898c54d42c8018edc.png

 如果有大量的G那么队列迟早会满,此时会将G放入到全局队列中

551ecbd43e774ddf9501d56c1c63206d.png

 接下来聊聊取的顺序,M会疯狂的从协程队列中取G,如果自己的队列中没有了他会去全局队列中找G,如果全局队列中也没有他会去其他处理器的队列中抢

350858468da74e13b3a5999391c9c750.png

 如果都没有取到,M会选择与P断开连接去休息

上面提到的问题中,我们并没有阐述当一个协程阻塞时的处理方式,当一个协程阻塞时,M不会等待,M会跳过该协程去执行其他协程

c6239f9f77fc4311b816eac1c6b72e39.png

 系统调用(Syscall)

这个定义不明白的可以去百度,大概意思是操作系统提供给用户的用来操做系统内核的函数接口,看下图应该不难理解

1468473725ee4a3dab84ed9d0dab6d5b.png

 为什么要说系统调用,如果G进行了系统调用,那么M也会进入系统调用,此时P不会傻傻的等待,而会找其他的M执行自己队列中的G(此时有两种解决方式,要么解阻塞,要么就自旋也就是下面的方式)

41c0f9d9e03c4265a9a8dedd22b102c8.png

 感兴趣的童鞋也可以去看看源码,这里我浅浅的解一下图

5206f3f96d6a477b811b1f54ea335f0c.png

d03486e33c0a4da48112803498f1b64f.png

 这个是G的结构体b71264bf40954681b18f1257677c441f.png

 这个是M的结构体

87ee94cbeb1543ff8ebf6b9ff11b15b3.png

 这个是P的结构体

b1fc69c0fd0e45c281e38b1b7c09c036.png

 最后一个小细节,P的队列长度为256

c745743b822b4838a755a6a2df5efd8b.png

20221120改

之前考虑不足,并没有思考一下问题

上面我们知道P的队列长度为256,那么最多可以用多少个P、多少个M,我们可不可以通过设置去改变呢?

1、首先M、P的数量关系不是绝对的1:1,当有一个G阻塞时,上文提到M也会跟着阻塞,那么就有可能创建新的M 继续执行 P队列中的 G

2、最多有多少个P? 这个是可以设置的,我们通过 $GOMAXPROCS查看 、设置

3、M也就是线程,最大值是10000

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不背八股睡不着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值