并发和并行的区别_【系统设计】图说并发和并行

现在我们都说设计可并行的程序、高并发的程序?而且很多时候潜意识里面觉得对并行(Parallelism)和并发(Concurrency)的的区别很清楚,但是如果要明确的说出二者的区别,又感觉没法给出一个非常清晰的描述。最近看到Go语言发明者之一的一篇演讲《Concurrency is not Parallelism》,觉得挺不错的。因为特别喜欢的里面的配图示例,所以博客,将其翻译过来,也方便一些网络不畅的人。文章末会给出原文PPT和视频的链接,有兴趣的同学可以去看看。

那么什么是并发?什么又是并行呢?并行的概念比较简单,并行总是和执行(executions)相关,很多东西同时执行就是并行;而并发则是通过一些方式组织你的程序,让它可以分成多个模块去独立的执行。并行必然是需要多核的,一个处理器是无法并行的;但并发和处理器并没有什么必然联系,在一个处理器上面,我们的程序也可以是并发的。好吧,有点绕。我们直接上Rob Pike的例子:这个例子是gopher们需要将一堆过时的语言指导书用小推车推到垃圾焚烧炉去烧毁(这个例子也是非常搞笑...)。

刚开始,我们只有一个gopher,完成任务必然需要比较长的时间:

b4e1acc3a86fed584fd1d3a93c6f7483.png

此时,如果再增加一个gopher,那也没用,因为它没有车...

702e6a8cc809dc39e9332853cdfb0b0b.png

好吧,那我们再找辆车:

b97726a97a7021c11f6c0d43da895930.png

这样虽然比之前快了,但还是有瓶颈的。因为书只有一堆,火炉也只有一个,所以我们还必须通过消息来协调两个gopher的行动。好吧,那我们再把书分成两堆,再增加一个火炉:

7b66cb566b142202253d742d7f5db215.png

这样就OK了,我们就可以比之前快差不多一倍了。

这个模型就是并发的,因为两个gopher可以独立的完成一件事了;但是却不一定是并行的,比如可能同一时刻只有一个gopher是干活的。但是我们这样去组织的话,让程序并行执行也会非常的容易。当然,除了这种,我们还可以设计出来很多并发模型,继续接着看漫画...

这次我们找了3个gopher,一个专门负责装车,一个专门负责运输,一个专门负责卸货焚烧,当然三个gopher之间需要使用一些诸如消息通信之类的手段进行协调。

1f8f3343ab6d8921305ee170f83e4d71.png

然而我们却发现运输的这个gopher很累,有瓶颈。好,我们再招聘一个gopher,专门负责还空车:

4c18b8747827f2ffc4a934ca7103c489.png

两个gopher去搞运输,这样如果协调的好的话,理论情况下工作效率将是一个gopher的4倍。

这个新的并发模型就会比之前的模型更高级一点了,此时我们再将这种并发模型并行化:

e9efc98327055aa560493783504462f0.png

漫画还没完,我们接着看另外一种并发模型:运输的gopher抱怨说运输路程太远,那我们就增加一个中转站(我觉得实际中这个gopher很可能会被解雇):

4d3e5f247745300620215fc3f5743ae7.png

然后再将这种并发模型并行化:

88da1a3477dc5bcc2c479847c0674557.png

我们也可以这样设计并发模型:

0fb2cedc0bae0f5134e2a26e3d5f0b12.png

然后再并行化:

5c6a00129c395862bdbee60041e6caef.png

OK,至此漫画就完了。可以看到有很多种并发模型,每种模型也可以很容易的并行化起来。回到程序中,书就代表着数据;gopher就是CPU;而车可能就是一些序列化、反序列化、网络等设施;火炉就是代理、浏览器或者其他的消费者。而上面的并发模型就是一个可扩展的Web Service。

至此,我们对于并发和并行的关系应该比较清楚了。如果喜欢看图的,这里再推荐一篇2016年Gopher大会上的一个演讲的文章:Visualizing Concurrency in Go,里面的配图也非常的炫酷哦~

演讲幻灯片链接:https://talks.golang.org/2012/waza.slide演讲视频请链接:https://www.youtube.com/watch?v=cN_DpYBzKso&t=550s

9afb510b533b7b713481ce8c78b6e849.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值