在 Golang 的并发编程中,GMP 是一个重要的概念,它代表了 Goroutine、M(线程)和 P(调度器)。这个强大的三位一体的并发模型使得 Golang 在处理并发任务时非常高效和灵活。通过 GMP 的组合,Golang 实现了一种高效的并发模型。它充分利用了多核处理器的优势,并通过轻量级的 Goroutine 实现了高并发的编程模式。但是GPM到底是怎么工作的呢?今天这篇文章就为您解开GPM的神秘面纱。
站在用户的角度思考问题,与客户深入沟通,找到乌兰察布网站设计与乌兰察布网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、做网站、企业官网、英文网站、手机端网站、网站推广、国际域名空间、网站空间、企业邮箱。业务覆盖乌兰察布地区。
早期的计算机都是单进程操作系统,各个进程之间都是顺序执行,也就是进程A执行完了才能执行进程B。
「对于cpu来说,进程和线程是一样的,这里我们就不讨论进程和线程的区别了」。
基于以上的问题,于是就出现了多进程/线程操作系统。
对于一个线程来说其实分为两部分,「用户空间」和「内核空间」。
当然如果只是这样把用户空间的协程和内核空间的线程一一绑定还是没有解决问题的,如果开启的比较多,那么对应的线程也会跟着一起增加,cpu频繁切换的问题还是没有解决,于是就引入了「调度器」的概念。
引入调度器来在各个协程之间切换,cpu只需要关注内核空间的线程即可,这样「解决了cpu在各个协程之间不断切换的问题」。
这样设计虽然解决了cpu频繁切换的问题,但是如果协程A发生了阻塞,肯定会导致协程B无法被执行。而且如果计算机是多核,那么是无法利用到多核的优势的。显然是不合理的。
对于多核的计算机,在内核空间可以开启多个线程(具体开启几个由计算内核决定,人为无法控制),所以问题的核心点就转移到了协程调度器上面,不管是什么语言,「协程调度器」做的越好,相对的「cpu利用率」也就越高。
golang在早起调度器处理是比较简单的,具体流程如下:
GMP模型主要指的是G(gorountine协程),M(thread线程),P(processor处理器)之间的关系。
存放等待运行的G。
这种情况下M2对应的P会从M1对应的P的本地队列中把G3偷取过来执行,提高CPU的利用率,这种机制叫做「work stealing机制」。
如果M1和M2都在正常执行,但是M1对应的G1发生了阻塞,那么势必会影响到G2的执行,那么GMP是如何解决的呢?
并行利用其实比较好理解,其实也就是开启了多少个P,P的个数是有GOMAXPROCS来决定的,一般都会设置为 「CPU核数/2」。
对于传统的co-routine来说,如果一个C和cpu进行了绑定,那么只有他主动释放,另外一个C才能和cpu进行绑定。但是在golang中,如果一个G和cpu进行了绑定,那么时间限制最多为10ms,另外一个G就可以直接和cpu绑定。
抢占策略。
要想了解go的启动周期,首先得了解M0和G0的概念。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
比如我们看上断代码的执行流程。
在执行到main函数之前,会有一些初始化的操作,比如创建M0,创建G0等等。
当执行main函数的时候,M0已经和其他的M是一样的了,main函数会进入M0对应的p的本地队列中,然后和M0绑定执行,如果执行超时(10ms),则会重新放到M0对应的本地队列中。一直到执行到exit或者panic为止。
当前标题:Golang的GMP:并发编程的艺术
标题链接:http://www.shufengxianlan.com/qtweb/news2/602.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联