串行,并发与并行
最近看到一个问题 串行,并发与并行的区别,查阅了一些网上的资料和视频,谈谈自己的理解,不当之处,欢迎指正!
首先看两句话:
- Concurrency is not Parallelism. 并发不是并行
- Concurrency enables parallelism & makes parallelism(and scaling and everything) easy. 并发允许去并行,并发让并行更容易
我的理解是,并发其实是一种处理问题的方法,可以让问题处理起来更高效,但不是必然。
关于并发和并行网络上有很多的例子,比如说小学初中常见的数学题目修路,路的规格是5000米×25米,处理这个问题的方法有很多,只给一个工程队干,这是一种串行的解决方法。分成两条2500×25米的路,分别给两个工程队干,这是一种并发的解决方法。
串行就是很简单的一个工程队一段一段地修完整路,直到最后解决了修路的问题。
并发就是我将这条路分给多个工程队干,至于各个工程队怎么干我不管,等到多个工程队各自完成任务,我这个问题也就解决了,并发相比串行来说,效率提高了不少,但是并发不是必然的,因为串行是可以解决问题的,只是我们需要提高效率,追求更快,才考虑通过并发去解决问题。
那么并行又是什么?当我们对问题进行了并发处理,把修路问题分给了多个工程队,如果多个工程队同时再施工现场修路,这就是并行,可以说并发是一种处理问题的思路,而并行是真正去实行这种方法(真正的同时有多支工程队在现场干活)了。
有下面的一些结论
- 当找不到一个问题如果并发的方法,也就不可能对该问题并行执行。
还是拿修路为例,如果找不到把路分给多个工程队修的方案(并发),又怎么会有多个工程队同时在施工现场施工呢(并行)?
- 并行的上限是由并发的方法设计决定的。
以修路为例:并行的上限(最多有多少工程队能同时在现场施工)是由并发的方法(把这条路分给多少个工程队修)所决定的。
- 并发是多个任务交替使用CPU,在只有一个CPU的情况下,同一时刻只有一个任务在跑,但任务之间切换非常快,给我们的感觉是多个任务同时跑,其实不是。(相当于只有一个工程队的情况)
- 只有并行才是真正意义上的多个任务同时跑。(多个CPU,多个工程队)
- 并行跑的多个任务如果是一个问题分解出来的,那么这些任务既是并发,又是并行。如果不是同一个问题分解出来的,那么是并行,不是并发。
上面关于串行,并行,并发仅仅局限在单任务中,也是只有一条公路要修。
而真实计算机中的串行,并发,并行多发生在需要解决多任务问题。计算机中待解决的很多个任务,可以看成是多条待修的公路,而一个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分别去处理多个任务,是并发,不是并行。
参考资料: