Goroutine与CSP

Goroutine简述

在go语言开发过程中,Goroutine是保证go语言并发的重要机制。通过go func() 我们可以简单的调用Goroutine,很方便的使用其轻量级的并发方案。
对比于系统级别线程:

  • 用户空间 首先是在用户空间,避免内核态和用户态的切换导致的成本。
  • 由语言或者框架层调度
  • 更小的栈空间允许创建大量实例(百万级别)

Goroutine调度器

在这里插入图片描述

1.M 代表的是系统线程,P是处理器核心,G是代表Goroutine。M和G 实现的是M:N的关系。也就是说系统线程和Goroutine 是多对多的关系。每个M对应一个执行G的队列。
2.在某个M被阻塞,在该M对应的G被迁移。如果M空闲,则问全局队列请求G来执行。如果全局队列为空,则向其他未空闲的M中的队列获取G。
3.当G被阻塞时,会挂起当前的G。移除执行队列,等待唤醒。当被唤醒时,将G返回到全局队列,继续执行。

CSP模型

CSP(Communicating Sequential Process)模型提供一种多个进程公用的“管道(channel)”, 这个channel中存放的是一个个”任务”。
go语言中的goroutine就是参考的CSP模型,原始的CSP中channel里的任务都是立即执行的,而go语言为其增加了一个缓存,即任务可以先暂存起来,等待执行进程准备好了再逐个按顺序执行.

Golang中使用 CSP中 channel 这个概念。channel 是用来在不同的发送者和接收者之间进行通信,它的通信模式类似于 boss-worke。发送者将消息发送给channel以后,阻塞监听消息是否被处理,等待消息处理完毕。而发送者和接收者之间是匿名的,是阻塞异步的执行。在实现原理上其实是一个阻塞的消息队列。当然,也可以实现带缓存的channel。在缓存范围内,是完全异步消息队列。

扩展阅读

CSP model paper

猜你喜欢

转载自blog.csdn.net/qq_35554975/article/details/87859387
CSP