并发和并行

  • Go语言并发并行概念
    • 协程
    • GPM模型

Go语言并发并行概念

首先对于go语言来说分为并发和并行

1、并发:并发是指在很短的时间内完成多个任务,只是宏观上的并发,其实是cpu的切换,对于我们肉眼是观察不出来的
2、并行:并行是指在同一时刻两个或两个以上的任务同时执行(简单来说就是多个有cpu)
并发是逻辑上的概念,而并行是物理运行状态,并发包含并行

协程

协程:其实就是轻量级线程,本身就没有协程这个东西,我们只是在用户态做了封装,对于操作系统来说分为用户空间和内核空间,协程就是在用户空间进行创建的,操作系统只认识进程和线程,并且这两个都是内核空间进行维护的,我们并不能改变,所以我们就得对用户空间进行改变

1、类似于c++、java这种语言就是对线程进行操作的,但是创建线程也有个限制,一般创建10000个就已经是上限了,并且对于进程和线程来说,开销太大了,并不能实现真正的高并发
2、创建一个进程大概是4GB,创建一个线程大概是4MB,所以对于进程和线程来说存在两个缺点

  • 高内存
  • CPU切换效率低

3、此时就引入了协程,而golang最大的特点就在于高并发,golang对协程做了处理,名为goruntine,内存只需要几KB,并且协程之间切换速度快,这个是由go语言封装的协程调度器决定的
大家可以做个对比(进程4GB->线程4MB->协程2KB),所以协程可以做到高并发

GPM模型

GPM模型是Golang目前正在使用的模型
内核空间:创建多个操作系统内核线程 (这个是底层实现的,我们改变不了,只能进行使用)
用户空间:创建多个协程 (语言层面,不同的语言做出来的协程调度器是不一样的)

此时就引入了协程与线程比例数

  • 协程:线程 = M :1,就是多个协程对应一个线程,此时如果一个协程阻塞了,那么其他协程还是会进行等待,这样解决不了问题
  • 协程:线程 = 1 : 1,就是一个协程对应一个线程,此时还不如不要协程,创建一个协程就得创建一个线程,这样的直接用线程是一样的
  • 协程:线程 = M : N,就是多个协程对应多个线程,协程的数量肯定是比线程多得多,所以GPM模型就采用的M :N的方式

1、早期的golang调度器

是协程直接和线程打交道

2、GPM模型
(1)G:即Go协程,每个go关键字都会创建一个协程
(2)P:处理器(Go中定义的一个摡念,不是指CPU),包含运行Go代码的必要资源,也有调度goroutine的能力
(3)M:工作线程,在Go中称为Machine

  • 图中的M就是和操作系统打交道的线程,每个M都会持有一个P,P是存储一个或者多个Go协程的本地队列,P负责把Go协程调度到M中去执行
  • P的个数在程序启动时决定,默认等于CPU的核数,由于每个M必须持有一个P才可以运行Go代码,所以运行的M的数量也就是线程数也一般等于CPU的个数,以达到尽可能的使用CPU而又不至于产生过多的线程切换开销
  • 程序中可以使用runtime.GOMAXPROCS()设置P的个数

3、Goroutine的调度策略
(1)队列轮转

  • 上面说到P是包含一个或多个go协程的本地队列,当不考虑系统调用或者io操作时,P会周期性的将go协程调度到M中去执行,执行一小段时间,保存当前执行的上下文,然后把该go协程放到本地队列的队尾,继续去调度下一个go协程让M执行
  • 除了P本地队列,还有一个全局队列,P也会周期性的去查看一下全局队列,看是否有go协程需要被执行,有需要的就将其调度到M中进行执行,全局队列中一般存放的是系统调用中恢复的go协程,P会周期性的查看全局队列是因为防止全局队列中的go协程被饿死

(2)系统调用

  • 一般来说M的数量为CPU的数量就可以满足需求了,但是M的数量一般来说会创建的比P的数量多一点,Go也会提供一个池子,类似于c++或者java的线程池,当M的数量不够用时就从池子中取出,当不用了就放回池子,当池子中的线程不够用时就新创建一个
  • 当M运行的G发生系统调用时,如下图所示

如图所示,G0进入了系统调用,即阻塞了,此时M0就会继续处理这个进入系统调用的Go协程,但是他会释放掉自己关联的P本地队列,同时会有新的M去接替这个P本地队列,只要P不空闲,就可以充分利用CPU
这个新的M可能是从线程池中获取的,也可能是新建的,当G0系统调用结束后,根据M0是否能获取到P本地队列来确定G0到底该如何让处理

  • 当M0获取不到P时,G0会被放到全局队列中,此时M0会被放到线程池中睡眠
  • 当M0可以获取到P,把G0放入到P队列中,继续执行G0

(3)工作量窃取


当M关联的P本地队列中没有Go协程了,此时就会去全局队列中查看是否有需要执行的Go协程,如果没有,就会去别的P队列中偷取,每次偷去的数量一般为一半

Go语言并发原理 | GPM模型相关推荐

  1. go语言怎么 控制一个变量输入的范围_go语言并发原理和机制【二】

    上图同样来自bing每日壁纸.很应景~~ 老规矩吧,废话也懒得说了.接上一篇: 甘蔗:go语言并发原理和机制[一]​zhuanlan.zhihu.com 目录 1.再探协程 什么是协程序,上一篇文章仅 ...

  2. Golang并发编程-GPM协程调度模型原理及组成分析

    文章目录 一.操作系统的进程和线程模型 1.1.基础知识 1.2.KST/ULT 二.Golang的GPM协程调度模型 三.M的结构及对应关系 四.P的结构及状态转换 五.G的结构及状态转换 六.GP ...

  3. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)

    本文主要向大家介绍了Python语言之python并发原理(阻塞.非阻塞.epoll),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在Linux系统中 01 阻塞服务端 特征: ...

  4. .net httpwebrequest 并发慢_go语言并发之MPG模型

    请记住go并发的真理:Do not communicate by sharing memory; instead, share memory by communicating. 不要以共享内存的方式来 ...

  5. Go语言并发模型:使用 context

    简介 在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理 ...

  6. Go语言开发(九)、Go语言并发编程

    Go语言开发(九).Go语言并发编程 一.goroutine简介 1.并发与并行简介 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同 ...

  7. 12 Go 并发调度器模型

    一.聊聊并发这件事 在基础系列我们学习了Go的并发编程,对并发的概念已经有了一定的了解.在各种现代高级语言中,对并发的支持已经是标配,但Go的并发无论在开发效率还是在性能上都有相当的优越性.Go有什么 ...

  8. 从操作系统漫谈GOLang GPM模型

    前言 本文从操作系统谈起,简单介绍操作系统基本知识,引出进程.线程调度的基本原理和基本模型,然后从0到1设计Golang调度器,通过方案的逐步演进升级,可以了解到GPM模型设计理念. 阅读本文会了解到 ...

  9. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?

    2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...

最新文章

  1. linux 在执行命令过程中,反单引号(`)这个符号代表的意义为何?
  2. BasicModal - 简单易用的现代 Web App 弹窗
  3. swift 之SnapKit 动画
  4. 解决R 4.0版本包的安装错误
  5. 西南石油大学计算机科学院信息,梁宗文 - 西南石油大学 - 计算机科学学院
  6. Hsiaoyang: Google与站点地图Sitemap
  7. anaconda和vscode配置python_vscode配置anaconda3的方法步骤
  8. 信息系统项目管理师为什么不建议自学
  9. Bzoj4818--Sdoi2017序列计数
  10. [链表]---链表相邻元素翻转
  11. java system.setproperties_在JAVA中 System.getProperty 和 System.setProperty 方法.
  12. 计算机网络日志查询,系统资源管理_百络网警内网管理软件_电脑配置统计,系统日志,日志查询...
  13. [USACO09OCT]热浪Heat Wave
  14. Java实例练习——基于UDP协议的多客户端通信
  15. 从零开始山寨Caffe·叁:全局线程管理器
  16. oracle修改只读数据库中,如何在oracle中创建只读数据库链接
  17. 各浏览器驱动下载地址及selenium配置
  18. 老闪创业那些事儿(88)——上市的钟声响起
  19. win10计算机本地组策略编辑器,win10本地组策略编辑器找不到怎么办_win10电脑没有gpedit.msc的解决办法...
  20. 催收行业再现“暴力(利)”

热门文章

  1. Launcher Go布局客制化
  2. 光猫 高级NAT配置
  3. 一家赔了15年的书店,为什么得到人们如此厚爱?丨好书优选
  4. MT5指标三线KDJ指标下载
  5. 华硕ZX50JX4200 Mac OS10.15黑苹果分享
  6. 微信直播聊天室单房间1500万在线的消息架构演进之路
  7. 用VMware Converter实现Esxi5.0到Esxi6.0主机上的虚拟机迁移(V2V)
  8. 2021卫辉高考成绩查询,卫辉中考成绩查询2021
  9. 解决百度网盘二维码加载不出来问题
  10. 5种css隐藏元素的方法_在CSS中隐藏元素的10种方法