并行(Parallelism)和并发(Concurrency)是计算机科学中两个相关但本质不同的概念,它们的核心区别在于任务执行的方式和目标。
1. 并发(Concurrency)
- 定义:多个任务交替执行,表现为“同时进行”,但实际可能是通过快速切换(分时)实现的。
- 核心目标:提高系统的吞吐量和响应能力,充分利用等待时间(如I/O操作时的CPU空闲)。
- 实现条件:单核或多核均可实现并发。
- 例子:
- 单核CPU上运行多个线程,通过时间片轮转切换任务。
- 一个Web服务器同时处理多个用户请求(每个请求可能处于不同阶段)。
关键点:
- 任务在逻辑上同时进行,但物理上可能是串行交替的。
- 关注的是任务的调度与协调(如避免死锁、竞态条件)。
2. 并行(Parallelism)
- 定义:多个任务真正同时执行,需要硬件支持(如多核、分布式系统)。
- 核心目标:通过并行加速任务处理,缩短计算时间。
- 实现条件:必须依赖多核/多机/GPU等硬件。
- 例子:
- 多核CPU同时计算矩阵的不同部分。
- GPU的数千个核心并行处理图像像素。
关键点:
- 任务在物理上同时执行。
- 关注的是任务的分解与负载均衡(如MapReduce)。
直观对比
特性 | 并发 | 并行 |
---|---|---|
是否同时执行 | 逻辑上同时(可能交替) | 物理上真正同时 |
硬件依赖 | 单核即可 | 必须多核/多机 |
目标 | 提高系统效率(如响应速度) | 加速计算(如缩短耗时) |
典型场景 | I/O密集型任务(如Web服务器) | CPU密集型任务(如科学计算) |
补充说明
- 联系:并行是并发的子集。并行系统一定支持并发,但并发不一定是并行。
- 类比:
- 并发:一个人边吃饭边回消息(交替进行)。
- 并行:多个人同时吃饭(真正同时进行)。
理解两者的区别有助于设计高效的系统:
- 并发编程(如多线程)需关注线程安全、锁机制。
- 并行编程(如MPI、CUDA)需关注任务划分、通信开销。