今天介绍一下 go语言的并发机制以及它所使用的CSP并发模型

CSP并发模型

CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。

Golang CSP

Golang 就是借用CSP模型的一些概念为之实现并发进行理论支持,其实从实际上出发,go语言并没有,完全实现了CSP模型的所有理论,仅仅是借用了 process和channel这两个概念。process是在go语言上的表现就是 goroutine 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。

Channel

Golang中使用 CSP中 channel 这个概念。channel 是被单独创建并且可以在进程之间传递,它的通信模式类似于 boss-worker 模式的,一个实体通过将消息发送到channel 中,然后又监听这个 channel 的实体处理,两个实体之间是匿名的,这个就实现实体中间的解耦,其中 channel 是同步的一个消息被发送到 channel 中,最终是一定要被另外的实体消费掉的,在实现原理上其实是一个阻塞的消息队列。

Goroutine

Goroutine 是实际并发执行的实体,它底层是使用协程(coroutine)实现并发,coroutine是一种运行在用户态的用户线程,类似于 greenthread,go底层选择使用coroutine的出发点是因为,它具有以下特点:

  • 用户空间 避免了内核态和用户态的切换导致的成本
  • 可以由语言和框架层进行调度
  • 更小的栈空间允许创建大量的实例

可以看到第二条 用户空间线程的调度不是由操作系统来完成的,像在java 1.3中使用的greenthread的是由JVM统一调度的(后java已经改为内核线程),还有在ruby中的fiber(半协程) 是需要在重新中自己进行调度的,而goroutine是在golang层面提供了调度器,并且对网络IO库进行了封装,屏蔽了复杂的细节,对外提供统一的语法关键字支持,简化了并发程序编写的成本。

Goroutine 调度器

上节已经说了,golang使用goroutine做为最小的执行单位,但是这个执行单位还是在用户空间,实际上最后被处理器执行的还是内核中的线程,用户线程和内核线程的调度方法有:

  • N:1 多个用户线程对应一个内核线程

  • 1:1 一个用户线程对应一个内核线程

  • M:N 用户线程和内核线程是多对多的对应关系

golang 通过为goroutine提供语言层面的调度器,来实现了高效率的M:N线程对应关系

调度示意

图中

  • M:是内核线程
  • P : 是调度协调,用于协调M和G的执行,内核线程只有拿到了 P才能对goroutine继续调度执行,一般都是通过限定P的个数来控制golang的并发度
  • G : 是待执行的goroutine,包含这个goroutine的栈空间
  • Gn : 灰色背景的Gn 是已经挂起的goroutine,它们被添加到了执行队列中,然后需要等待网络IO的goroutine,当P通过 epoll查询到特定的fd的时候,会重新调度起对应的,正在挂起的goroutine。

Golang为了调度的公平性,在调度器加入了steal working 算法 ,在一个P自己的执行队列,处理完之后,它会先到全局的执行队列中偷G进行处理,如果没有的话,再会到其他P的执行队列中抢G来进行处理。

总结

Golang实现了 CSP 并发模型做为并发基础,底层使用goroutine做为并发实体,goroutine非常轻量级可以创建几十万个实体。实体间通过 channel 继续匿名消息传递使之解耦,在语言层面实现了自动调度,这样屏蔽了很多内部细节,对外提供简单的语法关键字,大大简化了并发编程的思维转换和管理线程的复杂性。

作者:falm
链接:https://www.jianshu.com/p/36e246c6153d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来源:https://www.jianshu.com/p/36e246c6153d

Golang CSP并发模型相关推荐

  1. golang 并发模型 CSP

    前言 了解并发和并行的概念: 并发:强调一段时间做多件事 并行:强调同一时间做多件事 actor 模型 Actor 模型是一个通用的并发编程模型,可以应用在几乎任何一种编程语言中,典型的是 Erlan ...

  2. Go 语言编程 — GPM 与 CSP 高并发模型

    目录 文章目录 目录 GPM 调度模型 基本概念 G(Goroutine) P(Processor) M(Machine) Golang Runtime Scheduler M:N 两级线程调度模型 ...

  3. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  4. 七周七并发模型与七周七语言

    借助Java.Go等多种语言的特长,深度剖析所有主流并发编程模型 基于锁和线程的并发模型是目前最常用的一种并发模型,但是并发编程模型不仅仅只有这一种,本书几乎涵盖了目前所有的并发编程模型.了解和熟悉各 ...

  5. 从并发模型看 Go 的语言设计

    传统的程序语言设计都不会将输入输出作为语言的核心,但 Tony Hoare 认为输入输出是基本的编程原语,且通信顺序进程(Communicating sequential processes,CSP) ...

  6. blp模型 上读下写_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  7. 9. 设计二个函数分别计算sinx和cosx_从并发模型看 Go 的语言设计

    传统的程序语言设计都不会将输入输出作为语言的核心,但 Tony Hoare 认为输入输出是基本的编程原语,且通信顺序进程(Communicating sequential processes,CSP) ...

  8. Golang面向并发的内存模型

    Golang面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有 ...

  9. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

最新文章

  1. SELECT 语句与其子句的详解
  2. 全息技术“量子飞跃”或彻底改变成像技术
  3. Linux内核移植之一:内核源码结构与Makefile分析
  4. 在vs2005中使用Com连接SAP系统(一)
  5. Linux中cat、more、less、tail、head命令的使用示例
  6. Burpsuite Web渗透-扫描工具(中间攻击,渗透大牛都用来修改包和监视包)
  7. gitee图床不能用了,心态崩了
  8. 点击加入购物车直接转到购物车页面
  9. Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数
  10. AcWing 877. 扩展欧几里得算法(拓展欧几里得模板)
  11. python程序初学者计算器界面_Python初学者,一个简单的计算器程序的数学函数
  12. 笔记内容:非线性控制理论
  13. 工作周记 - 第四周 (2016/06/12 - 2016/06/18) 我没喝多,但是今天话多了 - -
  14. 随手记---Pharming
  15. 【JavaScript】英雄联盟官网作品介绍,轮播图的实现
  16. CorelDRAW入门教程-用CDR制作漂亮小雨伞
  17. GSM模块通过服务器或GSM内部获取网络时间 网络授时
  18. 重装系统win7 win7系统怎么重装 win7系统重装教程
  19. 常用的在线JS解密工具
  20. 11 万字的字节码编程系列合集放送(ASM、Javassist、Byte-buddy、Javaagent)

热门文章

  1. pandas读取文件——CSV,Excel
  2. jsp实现html注册,jsp+servlet实现最基本的注册登陆功能
  3. html分页首页上一页下一页,HTML静态分页(形如:首页,上一页,下一页,尾页)...
  4. SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
  5. CSS控制所有浏览器水平居中和控制链接不换行的效果
  6. 检索数据_12_从表中随机返回N条记录
  7. 基于深度学习的CT图像肺结节自动检测(系列放在一起)
  8. PyTorch 入门实战
  9. 【洛谷3377】 左偏树(可并堆)
  10. 15行代码让苹果设备崩溃,最新的iOS 12也无法幸免