并发、并行、同步、异步、进程、线程详解
这些是操作系统和并发编程中的核心概念。下面逐一解释,并说明它们之间的关系。
1. 进程(Process)与线程(Thread)
进程:程序的一次执行实例,拥有独立的地址空间、内存、文件描述符等资源。进程间相互隔离,通信需要特殊机制(如管道、队列、共享内存)。
线程:进程内的一个执行单元,多个线程共享进程的资源(如内存、文件等),因此通信更简单,但需注意同步问题。
| 对比项 | 进程 | 线程 |
|---|---|---|
| 资源占用 | 独立内存,开销大 | 共享内存,开销小 |
| 切换速度 | 较慢(涉及地址空间切换) | 较快 |
| 通信方式 | 进程间通信(IPC)复杂 | 共享变量,需加锁 |
| 崩溃影响 | 一个进程崩溃不影响其他进程 | 一个线程崩溃可能导致整个进程退出 |
2. 并发(Concurrency)与并行(Parallelism)
并发:逻辑上同时处理多个任务,但实际物理上可能是在单个 CPU 上通过快速交替执行(时间片轮转)实现的。关注的是结构:多个任务能在同一时间段内开始、执行、完成。
并行:物理上真正同时执行多个任务,需要多核 CPU 或多个 CPU。每个任务在独立的核心上同时运行。
经典比喻:
- 并发:一个人同时吃三个馒头,一次咬一口,轮流咬。
- 并行:三个人同时吃三个馒头,每人吃自己的。
关系:并发是并行的基础(但并发不一定并行),并行需要硬件支持。
3. 同步(Synchronous)与异步(Asynchronous)
这是描述函数调用或任务通知方式的术语。
同步:发起调用后,必须等待调用完成并拿到结果,才能继续后续操作。调用方被阻塞。
异步:发起调用后,不等待结果,立即返回;调用方可以继续做其他事。当任务完成时,通过回调、事件或 Future 等方式通知调用方。
例子:
- 同步:你打电话给客服,一直在线等待直到问题解决。
- 异步:你留言并留下联系方式,客服解决后回电给你,你期间可以干别的事。
4. 它们之间的关系
- 并发/并行 描述的是任务执行的方式(交替或同时)。
- 同步/异步 描述的是调用或通知的模型(阻塞等待或不阻塞)。
- 进程/线程 是任务的载体,是实现并发或并行的基本单元。
常见组合:
- 同步阻塞:最常见的函数调用,调用者等待结果。
- 异步非阻塞:回调或 Promise 风格,调用者立即返回,完成后通知。
- 并发可以用多线程/多进程实现,也可以用异步 I/O(单线程事件循环)实现。
5. 总结表
| 概念 | 核心含义 |
|---|---|
| 进程 | 资源分配的基本单位,独立内存 |
| 线程 | CPU 调度的基本单位,共享进程资源 |
| 并发 | 逻辑上同时处理多个任务(可能交替) |
| 并行 | 物理上同时执行多个任务(需要多核) |
| 同步 | 调用等待结果,阻塞 |
| 异步 | 调用不等待结果,通过通知获取结果 |