进程、线程、协程 — 知识地图

本笔记为 MOC(Map of Content)

进程是资源分配的单位,线程是 CPU 调度的单位,协程是用户态轻量级线程。 本笔记提供三者对比与选型指南。

进程(Process)

进程是操作系统中资源分配的基本单位,是程序的一次执行实例。

特性说明
独立性每个进程拥有独立的地址空间、堆、栈、文件描述符等资源
隔离性进程间互不干扰,一个进程崩溃不影响其他进程
上下文切换开销最大 —— 需切换页表、刷新 TLB、保存/恢复寄存器等
通信方式IPC(管道、消息队列、共享内存、信号量、Socket 等)
创建开销大 —— fork/clone 系统调用成本高
典型场景浏览器多 Tab、微服务各进程隔离部署

延伸阅读

进程在 Linux 中的实现涉及 Inode、文件描述符 fd 等资源管理概念。

线程(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 服务器、网关):协程 优势巨大 —— 可同时处理数十万连接
  • 需要隔离(如微服务、容器):进程 是最佳选择

与线程池的联系

线程池本质上是对线程生命周期的管理工具 —— 既然线程创建/销毁开销大(因涉及内核态系统调用),通过池化复用线程来减少开销。

协程的出现进一步挑战了线程池的必要性

相关笔记