Go GMP

作者: 从此110 | 来源:发表于2020-05-05 22:20 被阅读0次

一文彻底弄懂go中的调度GMP
先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。

再来解释一下MPG是什么意思。

M代表内核线程,所有的G都要放在M上才能运行。

P代表控制器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。

G代表一个go routine单元。

补充几点常见的调度策略:

1,如果某个M陷入阻塞呢?
当一个OS线程M由于io操作而陷入阻塞,假设此时G0正跑在了M上,那么M上绑定的P就会带着余下的所有G去寻找新的M。当M恢复过来时,一般情况下,会从别的M上拿过来一个P,并把原先跑在其上的G0放到P的队列中,从而运行G0。如果,没有拿到可用的P的话,就把G0放入到全局global runqueue队列中,使G0等待被调度,然后M进入线程缓存。所有的P也会周期性的检查global runqueue并运行其中的goroutine,否则global runqueue上的goroutine永远无法执行。

2,如果有的M较忙,有的M较闲呢?
此时P所分配的任务G很快就执行完了(分配不均),这就导致了这个处理器P很忙,但是其他的P还有任务。此时,P首先会去global runqueue取G。但是,如果global runqueue没有任务G了,那么P不得不从其他的P里拿一些G来执行。一般来说,如果P从其他的P那里要拿任务的话,一般就拿run queue的一半,这就确保了每个OS线程都能充分的使用。

3,如果一个G运行时间过长,导致队列中后续G都无法运行呢?
启动的时候,会专门创建一个线程sysmon,用来监控和管理,在内部是一个循环。首先,记录所有P的G任务计数schedtick,schedtick会在每执行一个G任务后递增。如果检查到 schedtick一直没有递增,说明这个P一直在执行同一个G任务,如果超过一定的时间(10ms),就在这个G任务的栈信息里面加一个标记。然后这个G任务在执行的时候,如果遇到非内联函数调用,就会检查一次这个标记,然后中断自己,把自己加到队列末尾,执行下一个G。如果没有遇到非内联函数(有时候正常的小函数会被优化成内联函数)调用的话,那就惨了,会一直执行这个G任务,直到它自己结束;如果是个死循环,并且GOMAXPROCS=1的话,恭喜你,夯住了!亲测,的确如此。

4,一个G由于调度被中断,此后如何恢复?
中断的时候将寄存器里的栈信息,保存到自己的G对象里面。当再次轮到自己执行时,将自己保存的栈信息复制到寄存器里面,这样就接着上次之后运行了。 (≧▽≦)/
————————————————
版权声明:本文为CSDN博主「jigetage」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jigetage/java/article/details/103350180

相关文章

  • Go GMP

    一文彻底弄懂go中的调度GMP先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。 再来解...

  • go 调度器实现

    GO 语言的调度器 目录 GMP 模型简介 调度器实现机制 GMP 模型简介 先来一张经典的GMP 关系图 G 是...

  • Go - GMP模型

    简述 G — 表示 Goroutine,它是一个待执行的任务; M — 表示操作系统的线程,它由操作系统的调度器调...

  • [视频版]-Golang深入理解GMP

    HELLO GOPHER! 相信越来越多的Go浪小伙伴,都对Golang的GMP调度器流连忘返,GMP很多书籍都有...

  • GO实验(2)查看GMP调度

    前文 实验1.go程序执行流程[https://www.jianshu.com/p/baa775b400b3] 导...

  • 文件管理分析

    读《欧盟GMP》-3 全球的GMP,与我们息息相关的是中国GMP2010版,欧盟GMP,美国CGMP。 今天看看文...

  • go并发的那些事

    思考:go为什么那么擅长并发? 答:从设计理解上来讲我觉着golang的CSP并发模型与GMP调度器是基石。你看虽...

  • 【Go 精选】从 GM 到 GMP 模型

    本文简单介绍了 GM 和 GMP 模型,其中分析了 GMP 针对 GM 存在问题的优化点。 1 GM 模型 GM ...

  • go 的并发调度(一) GMP 模型

    协程和线程的历史关系? 抢占式和协同式抢占式就是线程无法决定自己执行多久,由操作系统(或其他分配系统)来分配一个线...

  • golang内存管理之内存分配

    一、知识准备 GMP运行时调度模型 go原生支持并发,不需要像Java那样需要显示地开启一个线程,也不像Pytho...

网友评论

      本文标题:Go GMP

      本文链接:https://www.haomeiwen.com/subject/qbfbghtx.html