串行,并发与并行

串行,并发与并行

最近看到一个问题 串行,并发与并行的区别,查阅了一些网上的资料和视频,谈谈自己的理解,不当之处,欢迎指正!

首先看两句话:

  • Concurrency is not Parallelism. 并发不是并行
  • Concurrency enables parallelism & makes parallelism(and scaling and everything) easy. 并发允许去并行,并发让并行更容易

我的理解是,并发其实是一种处理问题的方法,可以让问题处理起来更高效,但不是必然

关于并发和并行网络上有很多的例子,比如说小学初中常见的数学题目修路,路的规格是5000米×25米,处理这个问题的方法有很多,只给一个工程队干,这是一种串行的解决方法。分成两条2500×25米的路,分别给两个工程队干,这是一种并发的解决方法。

串行就是很简单的一个工程队一段一段地修完整路,直到最后解决了修路的问题。

并发就是我将这条路分给多个工程队干,至于各个工程队怎么干我不管,等到多个工程队各自完成任务,我这个问题也就解决了,并发相比串行来说,效率提高了不少,但是并发不是必然的,因为串行是可以解决问题的,只是我们需要提高效率,追求更快,才考虑通过并发去解决问题。

那么并行又是什么?当我们对问题进行了并发处理,把修路问题分给了多个工程队,如果多个工程队同时再施工现场修路,这就是并行,可以说并发是一种处理问题的思路,而并行是真正去实行这种方法(真正的同时有多支工程队在现场干活)了。

有下面的一些结论

  1. 当找不到一个问题如果并发的方法,也就不可能对该问题并行执行

还是拿修路为例,如果找不到把路分给多个工程队修的方案(并发),又怎么会有多个工程队同时在施工现场施工呢(并行)?

  1. 并行的上限是由并发的方法设计决定的

以修路为例:并行的上限(最多有多少工程队能同时在现场施工)是由并发的方法(把这条路分给多少个工程队修)所决定的。

  1. 并发是多个任务交替使用CPU,在只有一个CPU的情况下,同一时刻只有一个任务在跑,但任务之间切换非常快,给我们的感觉是多个任务同时跑,其实不是。(相当于只有一个工程队的情况)
  2. 只有并行才是真正意义上的多个任务同时跑。(多个CPU,多个工程队)
  3. 并行跑的多个任务如果是一个问题分解出来的,那么这些任务既是并发,又是并行。如果不是同一个问题分解出来的,那么是并行,不是并发。

上面关于串行,并行,并发仅仅局限在单任务中,也是只有一条公路要修。

而真实计算机中的串行,并发,并行多发生在需要解决多任务问题。计算机中待解决的很多个任务,可以看成是多条待修的公路,而一个CPU就是一个工程队

当只有单核CPU(单个工程队)的时候,首先可以确定是不可能有并行情况出现的。

单个工程队按照顺序依次修路,把公路A整条修完,再去修公路B,修完公路B,再去修公路C,直到所有的路修完。

就相当于计算机CPU,先把任务A做完,再把任务B做完,再把任务C做完,直到所有的任务完成。这种方式就是串行

而虽然只有一个工程队,那我工程队今天去修公路A,没有修完,但是明天开始公路A需要保养几天,不能干活了。如果死死坚持串行的话,那工程队这几天不是没事干了嘛,太浪费资源了,所以这时候就可以这几天先修公路B嘛,等到公路A保养好了可以干活了,我再继续修公路A。

这就相当于CPU先把任务A需要CPU的地方处理完成了,在任务A使用I/O或其他资源,而CPU空闲的时候,CPU抽空去把任务B需要CPU部分的部分帮他处理了,这样就大大提高了CPU的利用率,这种方式就是并发

而如果我有多个工程队,那干活的方式就灵活多变了,可以让多个工程队同时修一条路,修路这个任务既是并发,也是并行。也可以让多个工程队分别去修多条公路,这是并发,不是并行

相当于有多个CPU,让多个CPU同时处理一个任务中多个需要CPU的子任务,是并行,也是并发。让多个CPU分别去处理多个任务,是并发,不是并行

参考资料:

B站 蒋炎岩 “操作系统:设计与实现

文章作者: luo
文章链接: https://luo41.top/2021/10/20/串行,并发与并行/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luo's Blog