go语言-csp模型-并发通道

【前言】go语言的并发机制以及它所使用的CSP并发模型html

1、CSP并发模型

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

一、Golang CSP

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

二、Channel

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

三、Goroutine

  Goroutine 是实际并发执行的实体,它底层是使用协程(coroutine)实现并发,coroutine是一种运行在用户态的用户线程(协程),相似于 greenthread,go底层选择使用coroutine的出发点是由于,它具备如下特色:编程

  • 用户空间 避免了内核态和用户态的切换致使的成本
  • 能够由语言和框架层进行调度
  • 更小的栈空间容许建立大量的实例(须要栈空间4-5kb)

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

四、小结

  goroutine运行在相同的地址空间,所以访问共享内存必须作好同步。goroutine经过通道(channel)来通讯,而不是共享内存。使用channel用于多个goroutine通讯,内部实现同步。channel底层是一个相似map的数据结构的引用。即,引用传参。网络

2、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来进行处理。

       可参考:https://www.cnblogs.com/binyue/p/6555730.html

总结

  Golang实现了 CSP 并发模型作为并发基础,底层使用goroutine作为并发实体,goroutine很是轻量级能够建立几十万个实体。实体间经过 channel(底层引用数据) 继续匿名消息传递使之解耦,在语言层面实现了自动调度,这样屏蔽了不少内部细节,对外提供简单的语法关键字,大大简化了并发编程的思惟转换和管理线程的复杂性。

相关文章
相关标签/搜索