并发和并行这两个术语通常用于多线程程序。但并发和并行到底是什么意思,这两个术语又有什么不同呢?
我花了一些时间才最终理解并发和并行之间的区别。因此,我打算在本Java并发教程中添加一篇关于并发与并行的文章。
并发
并发意味着一个应用程序同时(并发)进行多个任务。当然,如果计算机只有一个CPU,那么应用程序可能不会真正同时进行多个任务,而是在一段时间内处理应用程序内部的多个任务。在开始下一个任务之前,它不会完成一整个任务。相反,CPU在不同的任务之间切换,直到任务完成。
即使应用内部只有一个线程在运行,该应用也可以是并发的。顺便说一下,这是我们(Nanosai)Thread Ops工具包的目标之一。
并行
并行的意思是应用程序将其任务拆分成更小的子任务,这些子任务可以并行处理,例如在多个CPU上真正的同时执行。
要实现真正的并行,应用程序必须运行多个线程,或者至少能够把任务安排在其他线程、进程、CPU或显卡等中执行。
并发与并行的详细对比
如你所见,并发与应用程序处理多个工作任务的方式有关。应用程序可以一次(顺序)处理一个任务,也可以同时(并发)处理多个任务。
而并行与应用程序处理每个单独任务的方式有关。应用程序可以从头到尾连续地处理任务,或者将任务拆分成可以并行完成的子任务。
如你所见,应用程序可以是并发且非并行的。这意味着它同时处理多个任务,但线程一次只执行一个任务。不存在并行线程或CPU中并行执行的任务。
应用程序也可以是并行且非并发的。这意味着应用程序一次只能处理一个任务,并且该任务被分解为可以并行处理的子任务。但是,每个任务(以及子任务)要先完成,才能再拆分和并行执行下一个任务。
此外,应用程序可以是非并发且非并行的。这意味着它一次只能处理一个任务,并且任务也不会分解为并行执行的子任务。
最后,应用程序也可以既是并发又是并行的,因为它既同时处理多个任务,又将每个任务分解为并行执行的子任务。但是,在这种情况下,并发和并行可能不会带来什么好处,因为计算机中的CPU光是处理并发或者并行就已经够忙的了。两者结合起来可能只会带来很小的性能提升甚至性能损失。在盲目采用并发并行模型之前,一定要先进行分析和度量。