文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Golang 的 GMP:并发编程的艺术

2024-11-30 10:29

关注

前言

在 Golang 的并发编程中,GMP 是一个重要的概念,它代表了 Goroutine、M(线程)和 P(调度器)。这个强大的三位一体的并发模型使得 Golang 在处理并发任务时非常高效和灵活。通过 GMP 的组合,Golang 实现了一种高效的并发模型。它充分利用了多核处理器的优势,并通过轻量级的 Goroutine 实现了高并发的编程模式。但是GPM到底是怎么工作的呢?今天这篇文章就为您解开GPM的神秘面纱。

调度器的由来

单进程系统

早期的计算机都是单进程操作系统,各个进程之间都是顺序执行,也就是进程A执行完了才能执行进程B。

「对于cpu来说,进程和线程是一样的,这里我们就不讨论进程和线程的区别了」。

存在的问题

多进程/线程操作系统

基于以上的问题,于是就出现了多进程/线程操作系统。

存在的问题

协程的诞生

对于一个线程来说其实分为两部分,「用户空间」和「内核空间」。

当然如果只是这样把用户空间的协程和内核空间的线程一一绑定还是没有解决问题的,如果开启的比较多,那么对应的线程也会跟着一起增加,cpu频繁切换的问题还是没有解决,于是就引入了「调度器」的概念

引入调度器来在各个协程之间切换,cpu只需要关注内核空间的线程即可,这样「解决了cpu在各个协程之间不断切换的问题」。

存在的问题

这样设计虽然解决了cpu频繁切换的问题,但是如果协程A发生了阻塞,肯定会导致协程B无法被执行。而且如果计算机是多核,那么是无法利用到多核的优势的。显然是不合理的。

对于多核的计算机,在内核空间可以开启多个线程(具体开启几个由计算内核决定,人为无法控制),所以问题的核心点就转移到了协程调度器上面,不管是什么语言,「协程调度器」做的越好,相对的「cpu利用率」也就越高。

go对协程的处理

内存控制和灵活调度

go对早期调度器的处理(GM模型)

golang在早起调度器处理是比较简单的,具体流程如下:

GM模型存在以下问题

GMP模型

GMP模型简介

GMP模型主要指的是G(gorountine协程),M(thread线程),P(processor处理器)之间的关系

全局队列

存放等待运行的G。

P的本地队列

P列表

M列表

调度器的设计策略

复用线程

work stealing机制

这种情况下M2对应的P会从M1对应的P的本地队列中把G3偷取过来执行,提高CPU的利用率,这种机制叫做「work stealing机制」。

hand off机制

如果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)

要想了解go的启动周期,首先得了解M0和G0的概念。

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为止

来源:程序员小饭内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯