并发、并行、同步、异步是计算机科学中与多任务处理密切相关的核心概念。它们的关系和区别如下:
1. 基本定义
(1) 并发(Concurrency)
- 定义:多个任务在时间上重叠执行(可能交替执行),但不一定是同时执行。
- 特点:通过任务切换(如时间片轮转)实现“看似同时”的效果,常用于单核或多核系统。
- 例子:单核 CPU 上运行多个线程,通过快速切换模拟同时执行。
(2) 并行(Parallelism)
- 定义:多个任务真正同时执行,需要多核/多处理器支持。
- 特点:物理上的同时执行,依赖硬件资源。
- 例子:多核 CPU 同时处理多个线程。
(3) 同步(Synchronous)
- 定义:任务按顺序执行,后续任务必须等待前一个任务完成。
- 特点:任务间存在依赖关系,执行顺序严格。
- 例子:函数调用后等待返回值,再执行下一行代码。
(4) 异步(Asynchronous)
- 定义:任务可独立执行,不阻塞后续任务。
- 特点:通过回调、事件通知等方式实现非阻塞,常用于 I/O 密集型场景。
- 例子:AJAX 请求发送后,继续执行其他代码,待响应返回再处理。
2. 关键区别
(1) 并发 vs 并行
| 维度 | 并发 | 并行 |
|---|---|---|
| 执行方式 | 时间重叠(交替执行,时间片) | 物理同时执行 |
| 硬件依赖 | 不依赖多核 | 需要多核/多处理器 |
| 目标 | 提高资源利用率 | 提升计算速度 |
| 场景 | I/O 密集型任务 | CPU 密集型任务 |
(2) 同步 vs 异步
| 维度 | 同步 | 异步 |
|---|---|---|
| 执行顺序 | 顺序执行,阻塞等待 | 非阻塞,任务独立执行 |
| 控制流 | 线性流程 | 事件驱动或回调驱动 |
| 适用场景 | 简单逻辑,强依赖关系 | 高延迟操作(如网络请求) |
3. 关系与组合
(1) 并发与同步/异步
- 并发 + 同步:多个任务交替执行,但需通过锁、信号量等机制保证数据一致性(如多线程同步)。
- 并发 + 异步:任务交替执行且相互独立(如 Node.js 的事件循环)。
(2) 并行与同步/异步
- 并行 + 同步:多个任务同时执行,但需在特定点同步(如 MapReduce 中的 Barrier)。
- 并行 + 异步:任务同时执行且无依赖(如 GPU 并行计算)。
4. 实际应用场景
- 并发异步:Web 服务器(如 Nginx)处理大量请求,通过异步非阻塞 I/O 实现高吞吐。
- 并行同步:科学计算中多线程处理数据,最终汇总结果(需同步中间状态)。
- 并发同步:数据库事务处理,多个线程访问共享资源时加锁。
- 并行异步:分布式系统中多个节点独立处理任务,结果通过消息队列异步收集。
5. 图示总结
|------------- 并发 -------------|
任务执行方式:交替(单核) 或 同时(多核)
|------------- 并行 -------------|
任务协调方式:
同步 —— 顺序等待
异步 —— 独立触发 + 回调/事件
6. 常见误区
- 并发 ≠ 并行:并发是逻辑上的多任务,并行是物理上的多任务。
- 异步 ≠ 多线程:异步可通过单线程事件循环实现(如 JavaScript)。
- 同步 vs 阻塞:同步是程序设计模式,阻塞是线程状态(可能由同步操作引起)。
理解这些概念有助于设计高效的系统架构(如高并发服务器、并行计算框架)和优化程序性能。