进程与线程的区别?¶
结论¶
| 维度 | 进程 | 线程 |
|---|---|---|
| 定义 | 资源分配的最小单位 | CPU 调度的最小单位 |
| 内存 | 独立地址空间 | 共享进程的地址空间 |
| 开销 | 创建/销毁/切换开销大 | 开销小 |
| 通信 | IPC(管道、消息队列、共享内存、Socket) | 直接读写共享变量(需同步) |
| 健壮性 | 一个进程崩溃不影响其他 | 一个线程崩溃可能拖垮整个进程 |
| 切换 | 上下文切换慢,需切换页表 | 上下文切换快 |
详细展开¶
1. 资源分配 vs 调度¶
- 进程是操作系统资源分配的基本单位:独立的虚拟地址空间、文件描述符表、信号处理、内存映射。
- 线程是 CPU 调度的基本单位:多个线程共享进程的代码段、数据段、堆、文件句柄,但每个线程有自己的栈、程序计数器、寄存器。
2. 为什么线程切换更快¶
进程切换需要: 1. 切换页表(刷新 TLB)。 2. 保存/恢复更多上下文。
线程切换只需要保存栈和寄存器,地址空间不变,TLB 不失效。
3. 通信方式¶
- 进程间通信(IPC):管道、命名管道、消息队列、共享内存 + 信号量、Socket、信号。
- 线程间通信:
- 共享变量 +
synchronized/Lock wait/notifyvolatile- 阻塞队列(BlockingQueue)
CountDownLatch/CyclicBarrier/Semaphore
4. 并发 vs 并行¶
- 并发(Concurrent):同一时间段内交替执行,单核也能并发。
- 并行(Parallel):同一时刻同时执行,需要多核 CPU。
Java 视角¶
Java 程序至少有一个主线程(main),GC 线程、JIT 线程等是后台线程。Thread 对应 OS 线程(JDK 1.2 之后),所以 Java 线程切换成本接近原生线程。
高频追问
- 用户线程 vs 守护线程(Daemon):JVM 在所有用户线程结束后退出,守护线程用于 GC 等后台任务。
- 协程(Coroutine / Virtual Thread):用户态调度,比线程更轻量,Java 21 的虚拟线程就是这个方向。