并发与并行:软件设计与硬件性能的探讨

在信息技术行业中,"并发"和"并行"这两个术语常常让人感到困惑。许多开发者认为它们都意味着"同时执行",这在某种程度上是正确的,但它们之间存在一个重要的区别:

并发提供了一种并行的感觉,而并行正如其名,意味着真正的并行执行。

并行的感觉

并行的感觉意味着在同一个核心上执行多个任务,核心在任务之间切换上下文并为它们服务。也可以将这称为时间切片/重叠时间段,因为单个核心只是分配一些时间给一个任务,然后分配一些时间给另一个任务。

真正的并行

真正的并行意味着在多个核心上并行执行多个任务。

注意:"并发是一个更广泛的术语,而并行是它的一个子集"。

映射到现实世界,左侧的图像表示并行,右侧的图像表示并发。

为什么是并行的感觉,而不是真正的并行?

为了实现真正的并行,需要专用的核心、独立的内存等。需要更多的资源。

假设想要为某个任务完成的进度条显示。现在真的不想分配单独的核心来显示进度。

不想要性能,想要的是生理上让用户感觉两个任务同时发生。

只是想打败人眼的100 FPS能力,给人一种并行的错觉,而不会过度使用计算机资源。但是,假设想要处理包含百万条记录的大型Excel文件,那么是的,希望有真正的并行来实现性能。

并发是关于设计的,而并行是关于硬件的

为了实现并发,需要独立地构建应用程序逻辑。例如,假设想要处理员工数据,想要将薪水增加x%,奖金增加x%。

所以可以按照不同的设计将应用程序分解成逻辑单元:

将数据分成每份50%的大小。

将每份50%作为单独的单元进行处理。

将奖金计算作为单独的单元。

将薪水计算作为单独的单元。

将数据分成每份50%的大小。

对于每份50%的数据,分别单独处理奖金计算和薪水计算。

可以有许多这样的设计和组合。所以当说应用程序支持并发时,应用程序应该被分解成小的独立单元。

现在将这些单元在单个核心上运行(并发)或者在多个核心上运行(并行)。所以并发是关于设计的,而在并行中,更多地从硬件的角度来谈论,比如2个核心、3个核心等。

如果尝试将每个并发代码作为并行运行,将不必要地消耗资源。所以问问自己,想要幻觉(并发)还是想要性能(并行)。

并发和并行的基本定义、目标、视角和资源利用如下:

并发 并行
在同一个核心上使用重叠或时间切片执行多个任务。 在不同的核心上执行多个任务。
在不增加资源压力的情况下提供并行的感觉。 为了性能而实现真正的并行。
软件设计:以合作的方式组合独立执行的计算。 硬件:并行执行计算。

并行是并发的一个子集。

并发使得并行成为可能。

并发更多地是关于软件设计,而并行更多地是关于硬件。

并发提供了并行的幻觉,而并行是关于性能。

并发只需要一个核心,而并行至少需要2个核心。

Rob Pike的《并发不是并行》

关于并发和并行的不错讨论

并发和并行视频

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485