八股文解析
进程与线程区别(含协程)
发布于 2026-08-03
操作系统进程线程八股文后端
进程与线程区别(含协程)
一句话结论
- 进程:资源分配最小单位,独立地址空间,切换成本高
- 线程:CPU 调度最小单位,共享进程资源,切换成本低
- 协程:用户态轻量线程,由程序自己调度,切换成本最低
面试标准答法
核心区别
| 维度 | 进程 | 线程 | 协程 |
|---|
| 资源开销 | 独立地址空间、文件描述符等 | 共享进程资源 | 几乎无额外开销 |
| 切换成本 | 高(切页表、刷新 TLB) | 中(保存/恢复寄存器) | 低(用户态切换) |
| 通信方式 | IPC(管道/消息队列/共享内存) | 共享内存 + 锁 | channel / 共享变量 |
| 调度者 | OS 内核 | OS 内核 | 程序自己 |
| 崩溃影响 | 互不影响 | 一个线程崩可能拖垮进程 | 通常由运行时恢复 |
为什么线程切换比进程轻?
- 线程共享地址空间,无需切换页表
- TLB(快表)不用全刷新
- 内核只需保存/恢复少量寄存器和栈指针
Go 协程(goroutine)优势
- 栈初始小(2KB),可动态扩容
- GMP 调度模型:M 个内核线程跑 N 个 goroutine,N 远大于 M
- 阻塞时自动让出(channel、网络 IO、定时器),不占内核线程
适用场景
| 场景 | 推荐 |
|---|
| 需要强隔离、多核利用 | 多进程 |
| 共享数据多、高并发 IO | 多线程 + 连接池 |
| 超高并发、轻量任务 | 协程(Go / Erlang / Python asyncio) |
常见追问
| 追问 | 要点 |
|---|
| 什么是线程安全? | 多线程访问共享数据时结果正确,需同步或不可变设计 |
| 进程间通信方式? | 管道、消息队列、共享内存、信号量、socket |
| 为什么 Go 适合高并发? | goroutine 轻量、GMP 调度、channel 简化同步 |
面试回答模板(30 秒版)
延伸准备
- 能解释
fork() 的 COW 机制
- 能对比 Java 线程与 Go goroutine 的内存占用
- 能说出
volatile / synchronized / CAS 的适用层级