并发与并行的区别
原文链接:https://www.bughui.com/2017/08/23/difference-between-concurrency-and-parallelism/
很多年前,上操作系统课的时候,老师告诉我们“并行是指同一时刻同时做多件事情,而并发是指同一时间间隔内做多件事情”。这里的差别初看确实简单明了,不过较真的我表示不同意。老师们说的话,貌似并不严谨。时刻是指时间轴上的一个点,一个瞬间,这是个不可再分的量。如果在时间这个维度上没有增量,何来“做事”一说!也就是说,老师们口中的“时刻”与时间间隔(时间段)其实是等价的。那老师们说的那个“区别”有什么区别吗?多年过去,今天偶然又讨论起这个话题。。。
正是因为当初老师给同学们灌输了这种模棱两可的概念,所以每次提起这个话题的时候,总是免不了要有一番口水仗。关于这个问题,我在不同的场合与不同的小伙伴争论过无数次了,厌烦了。所以,今天我想把我自己理解的概念写下来,终结关于这个话题的争论。
首先,我们来看看前辈的看法:
Concurrency is when two tasks can start, run, and complete in overlapping time periods. Parallelism is when tasks literally run at the same time, eg. on a multi-core processor.
Concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations.
Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
An application can be concurrent – but not parallel, which means that it processes more than one task at the same time, but no two tasks are executing at same time instant.
An application can be parallel – but not concurrent, which means that it processes multiple sub-tasks of a task in multi-core CPU at same time.
An application can be neither parallel – nor concurrent, which means that it processes all tasks one at a time, sequentially.
An application can be both parallel – and concurrent, which means that it processes multiple tasks concurrently in multi-core CPU at same time.
Vipin Jain. Differences between concurrency vs. parallelism
翻译成中文:
并发是两个任务可以在重叠的时间段内启动,运行和完成。并行是任务在同一时间运行,例如,在多核处理器上。
并发是独立执行过程的组合,而并行是同时执行(可能相关的)计算。
并发是一次处理很多事情,并行是同时做很多事情。
应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务在同一时刻执行。
应用程序可以是并行的,但不是并发的,这意味着它同时处理多核CPU中的任务的多个子任务。
一个应用程序可以即不是并行的,也不是并发的,这意味着它一次一个地处理所有任务。
应用程序可以即是并行的也是并发的,这意味着它同时在多核CPU中同时处理多个任务。
看完前辈的话有何感想呢?好像理解了些什么是不?o(∩_∩)o 哈哈!这个翻译可能稍微有那么一些别扭,因为这位前辈的话也是比较随意的。在stackoverflow发言,比较的口语化。
虽然他的话略罗嗦,不够精炼,但是已经比较全面的阐述了这两个概念的区别了。
我再来用我自己的话分析一下:
并行才是我们通常认为的那个同时做多件事情,而并发则是在线程这个模型下产生的概念。并发表示同时发生了多件事情,通过时间片切换,哪怕只有单一的核心,也可以实现“同时做多件事情”这个效果。根据底层是否有多处理器,并发与并行是可以等效的,这并不是两个互斥的概念。举个我们开发中会遇到的例子,我们说资源请求并发数达到了1万。这里的意思是有1万个请求同时过来了。但是这里很明显不可能真正的同时去处理这1万个请求的吧!如果这台机器的处理器有4个核心,不考虑超线程,那么我们认为同时会有4个线程在跑。也就是说,并发访问数是1万,而底层真实的并行处理的请求数是4。如果并发数小一些只有4的话,又或者你的机器牛逼有1万个核心,那并发在这里和并行一个效果。也就是说,并发可以是虚拟的同时执行,也可以是真的同时执行。而并行的意思是真的同时执行。结论是:并行是我们物理时空观下的同时执行,而并发则是操作系统用线程这个模型抽象之后站在线程的视角上看到的“同时”执行。
再回过头去看看老师们的那句话,似乎也并没有什么不对的,只是不够严谨,容易被误导。这个问题,如果路过的同学没有意见的话,就到此为止了。没问题的话,以后,我就不再参与关于这个话题的争论了。(ーー゛)
以上就是我对并发与并行的理解,如有偏差,欢迎指正。