温故之.NET 中的并行并发概念解析

这篇文章主要讲解并行与并发的概念,以及它们之间的区别与联系

为了说明白并行与并发的区别,我们举了两个例子。我们先看一个例子:一个人干活和多个人干活

例子一:包子铺

并发

假设我们开了一家包子铺,生意特别好,早上的时候人特别多。最开始这个店铺(如同我们的电脑)只有我们一个人打理(一个处理器)。因此,来购买早餐(电脑有任务需要处理)的人都需要排队。就算这样,我们一个小时之内,还是可以卖很多份早餐出去(即在一段时间之内,单个处理器可以处理很多任务)。

这便是并发,它指的是,在一段时间内(注意是一段时间,而不是某个时间点),可处理的任务的数量,它不关注某一个时间点做了多少事情。比如QPS,它指的是一个查询服务器在每秒内能处理的请求数量。这和前面一个小时内卖多少份早餐是一样的

并行

与并发不同,并行指的是,在某个时间点,能处理的任务数量,即它重心在于每个时间点能处理的任务量(或者说处理任务的速度),而不关心一小时内或一分钟内处理的任务量。

比如,随着生意越来越好,人越来越多,一个人根本就忙不过来,所以我们请了三个帮手,加上我们自己,就有四个人可以同时卖早餐了。
假设我们之前一个小时内一个人可以卖 200 个包子,现在有四个人,是不是在一个小时内,差不多就能卖 800 个包子了。
因为在这一个小时内的每一个时间点,差不多都可以卖 4 份早餐出去(之前因为只有一个人,一个时间点只能卖一份)。
这就好比我们的电脑有四个处理器,在同一个时间点,可以处理的任务数量是 4 个。因此,在一秒内,并发量理论上就可以达到之前单个处理的四倍了

例子二:微信运动

微信运动,可以记录我们每天走的步数(可以认为我们每走一步,就是做一个任务)。

假设我们有一个微信运动群(一个电脑)

如果这个群里面只有一个人(一个处理器),那么这个群这一天的步数就是这个人的。即此时群的步数(并发量)由这一个人决定(电脑的并发量由这一个处理器决定)

如果这个群有10个人(10个处理器),那么这个群一天的步数就是这10个人这一天的步数之和了。即并发量由这10个处理器决定

这10个人,各自走着各自的路,而互不影响(并行),但却决定着这一天的步数(并发量)

总结一下

例子归例子,例子只是为了方便我们更好的理解并发、并行的概念,以及它们之间的联系。但实际项目、正式发布的环境中,并发量与并行速度还取决于任务之间的相关性(如线程间数据共享)、磁盘 I/O,网络带宽等等

因此,需要注意以下这些地方

  • 这两个概念表述的重点是不同的。并发指的是一个时间段内能做的事情的数量;并行指的是某一个时间点能处理的事情的数量
  • 并行会影响并发,但并发不仅仅由并行来决定。还有磁盘 I/O,网络带宽等等
  • 一个参与者(即一个处理器),也可以有并发,但却不会有并行。并行需要有至少两个参与者(即两个处理器)



既然这篇文章我们讲的是 .NET 中的并行并发,那自然就会说到任务并行库(TPL)、并行 LINQ (PLINQ)。其中TPL 包含数据并行、任务并行、数据流等概念

任务并行,以任务为基础,来实现多个独立任务的同时运行。这样可以充分的利用系统资源,同时可以更加方便的管理并行中的任务(因为对 Task 我们可以有非常精细的控制)

TPL 在多处理器上具有很明显的性能优势,处理器越多越明显。然而在处理器比较少(比如只有一个)的时候,性能可能反而会有所下降。因此在选择的时候,我们需要根据目标环境(部署的环境)进行权衡

关于.NET 中的并行并发就简要说一下,这篇文章主要以理解并行并发为主。希望我们能够通过这两个例子加深对这两个概念的理解



至此,这篇文章的内容讲解完毕。欢迎关注公众号【嘿嘿的学习日记】,所有的文章,都会在公众号首发,Thank you~

公众号二维码

你可能感兴趣的:(温故之.NET 中的并行并发概念解析)