标准答案
- 进程拥有独立虚拟地址空间、文件描述符表等资源,隔离性强但创建和通信成本较高。
- 线程属于进程,共享地址空间和大部分资源,适合共享状态的并发工作,但需要同步并承担互相影响的风险。
- 协程由运行时或库在用户态切换,切换成本低,适合大量 I/O 等待;如果协程执行阻塞系统调用或长时间 CPU 计算,仍会阻塞承载它的线程。
- 判断时先看是否需要故障隔离,再看工作是 I/O 密集还是 CPU 密集,以及运行时是否能正确处理取消、超时和阻塞。
题目解析
进程提供地址空间、文件描述符表等资源边界,线程通常共享进程地址空间和大部分资源,但拥有自己的栈和调度状态。协程则通常由语言运行时或库在用户态调度,只有在运行时把它放到线程或进程上执行时才会被内核调度。
协程适合大量可暂停的 I/O 工作,但一个协程执行长时间 CPU 代码或阻塞系统调用,仍会阻塞承载它的线程。线程可以利用多个 CPU,但共享内存带来锁、数据竞争和故障传播;进程隔离更强,却需要进程间通信和更多内存。选择应从任务类型、共享状态、隔离要求和观测结果出发。
常见误区
- 误区:把线程当成完全独立的进程。改正:说明线程共享地址空间和文件等资源,线程级故障可能影响整个进程。
- 误区:认为协程可以自动并行利用多个 CPU。改正:协程本身通常是并发而非并行,CPU 并行要靠多个线程、进程或释放运行时限制的扩展。
- 误区:只比较创建速度。改正:同时比较共享状态、上下文切换、内存、取消和故障隔离成本。