进程、线程、协程 — 知识地图
本笔记为 MOC(Map of Content)
进程是资源分配的单位,线程是 CPU 调度的单位,协程是用户态轻量级线程。 本笔记提供三者对比与选型指南。
进程(Process)
进程是操作系统中资源分配的基本单位,是程序的一次执行实例。
| 特性 | 说明 |
|---|---|
| 独立性 | 每个进程拥有独立的地址空间、堆、栈、文件描述符等资源 |
| 隔离性 | 进程间互不干扰,一个进程崩溃不影响其他进程 |
| 上下文切换开销 | 最大 —— 需切换页表、刷新 TLB、保存/恢复寄存器等 |
| 通信方式 | IPC(管道、消息队列、共享内存、信号量、Socket 等) |
| 创建开销 | 大 —— fork/clone 系统调用成本高 |
| 典型场景 | 浏览器多 Tab、微服务各进程隔离部署 |
延伸阅读
线程(Thread)
线程是操作系统 CPU 调度的最小单位,是进程内的一个执行流。
| 特性 | 说明 |
|---|---|
| 资源共享 | 同一进程的线程共享堆内存、文件描述符,但拥有独立的栈和程序计数器 |
| 上下文切换开销 | 中等 —— 用户态 ↔ 内核态切换,但无需切换页表 |
| 通信方式 | 直接读写共享内存(需同步机制保护) |
| Java 实现 | HotSpot JVM 中,Java 线程采用 1:1 模型,即每个 Java 线程直接映射为一个 OS 原生线程 |
| 创建开销 | 相对较大,每次创建需系统调用 |
| 最大数量 | 受系统资源限制(栈空间 ~1MB/个、OS 线程数上限) |
为什么线程切换比进程切换快?
同一进程的线程共享地址空间,切换时无需切换页表,只需切换栈和寄存器。而进程切换需要刷新 TLB(转换检测缓冲区),这是最耗时的操作之一。
协程(Coroutine)
协程(也叫纤程/Fiber、虚拟线程/Virtual Thread)是用户态的轻量级线程,由程序自身调度而非 OS 内核。
| 特性 | 说明 |
|---|---|
| 调度方式 | 协作式(Cooperative),非抢占式 —— 协程主动让出(yield)执行权 |
| 上下文切换开销 | 最小 —— 纯用户态切换,无系统调用,纳秒级 |
| 内存占用 | 极低 —— 一个协程栈可小至 KB 级别(vs 线程 MB 级别) |
| 数量规模 | 可轻松创建数万到数百万个 |
| 通信方式 | 通过通道(Channel)/ 异步 Promise 等机制,天然避免锁竞争 |
| Java 实现 | Project Loom — 虚拟线程(JDK 21+),Executors.newVirtualThreadPerTaskExecutor() |
| 其他语言 | Python async/await、Go goroutine、Kotlin Coroutine、C++ libco |
三者对比
| 维度 | 进程 | 线程 | 协程 |
|---|---|---|---|
| 资源拥有 | 独立地址空间 | 共享进程资源 | 共享线程资源 |
| 调度层级 | OS 内核 | OS 内核 | 用户态(程序/运行时) |
| 切换开销 | 最大(微秒级) | 中等(纳秒~微秒级) | 最小(纳秒级) |
| 创建速度 | 慢 | 中等 | 极快 |
| 内存隔离 | ✅ 完全隔离 | ❌ 共享(需同步) | ❌ 共享(协作式) |
| 数据安全 | 高(隔离) | 中(需锁) | 中(协作式无需锁,但需约定) |
| 并发模型 | 多进程 | 多线程 / 线程池 | 异步 / 协程池 |
| 适用场景 | 高隔离、高安全 | CPU 密集型 / I/O 密集型 | 高并发 I/O、大量短任务 |
场景选型
- 计算密集型:使用 线程 或 进程,充分利用多核 CPU
- 高并发 I/O(如 Web 服务器、网关):协程 优势巨大 —— 可同时处理数十万连接
- 需要隔离(如微服务、容器):进程 是最佳选择
与线程池的联系
线程池本质上是对线程生命周期的管理工具 —— 既然线程创建/销毁开销大(因涉及内核态系统调用),通过池化复用线程来减少开销。
而协程的出现进一步挑战了线程池的必要性:
- 线程池 = 复用 OS 线程,限制并发数
- 虚拟线程(JDK 21+)= 每个任务一个虚拟线程,无需池化,创建即用
- 详见 Java线程池创建方式 和 Java虚拟线程
相关笔记
- ThreadPoolExecutor核心参数 — 线程池的构造参数与工作流程
- Java线程池创建方式 — 如何正确创建线程池
- Java虚拟线程 — JDK 21 虚拟线程详解
- synchronized机制详解 — Java 内置锁如何保护线程间共享数据
- 乐观锁 和 悲观锁 — 两种不同的并发控制哲学
- CAS-Compare-And-Swap — 无锁并发的基础
- volatile关键字详解 — 内存可见性与指令重排序