进程、线程、协程的区别是什么?
后端开发第 7 / 13 题答题框架
参考思路:资源分配与调度维度对比→上下文切换成本→协程是用户态调度的意义(高并发 IO)→结合语言实现(Go goroutine/虚拟线程)谈适用场景。
五个经典回答示范
回答一 · 校招应届版
进程是资源分配的基本单位,有独立地址空间;线程是调度单位,共享所属进程的内存;协程是用户态的轻量执行单元,切换不进内核。切换成本:进程最大要换页表,线程其次要进出内核,协程最小只保存少量寄存器。所以高并发 IO 场景协程能用极小内存扛住大量连接。
回答二 · 1-3年经验版
我会结合实践讲:我们的网关从线程池模型改造成 Go 的 goroutine 后,单机长连接数从两万到五十万,内存反降。原因就是 IO 密集下协程按需调度,阻塞等待时让出而不是占着线程。但 CPU 密集任务协程没有优势,还是要靠多进程加线程池。选型要看负载是 IO 密集还是 CPU 密集。
回答三 · 资深版
我从三个维度系统讲:隔离性——进程最强,故障不互相影响,线程一个崩全进程崩;通信成本——进程靠 IPC,线程靠共享内存加锁,协程靠 channel 或共享但单线程内有序;调度权——内核调度对用户透明,协程调度可控可嵌入业务。工程决策经常是组合:多进程做隔离、每进程多线程或协程做并发,比如 Nginx 的模型。
回答四 · 追问应对
追问『线程共享进程的什么』:地址空间、打开文件、全局变量;私有的是栈、寄存器、线程局部存储;『协程为什么快』:用户态切换几十纳秒级、无系统调用开销、默认栈 KB 级;『Java 虚拟线程』:JDK21 的虚拟线程把协程模型带进 JVM,同步写法获得异步吞吐。
回答五 · 反面示范
『协程是更高级的线程,比线程快,所以能用协程就不要用线程,协程可以完全取代线程。』——点评:协程依附于线程运行,不是取代关系;快在 IO 场景的切换成本,CPU 密集反而无收益。绝对化的技术判断在面试里是减分项。
怎么练这道题
- 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
- 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
- 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。
这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。