1. 进程、线程、协程的本质区别,地址空间、调度主体、切换成本三个维度如何对比?
请从地址空间、调度主体、切换成本三个维度对比进程、线程与协程的本质区别?
- 进程是资源分配的基本单位,拥有独立地址空间;线程是 CPU 调度的基本单位,共享进程地址空间;协程是用户态协作式调度单元。
- 内核态切换(进程/线程)涉及内核态陷入、寄存器保存、内核栈切换、TLB/缓存失效;协程切换仅需用户态保存少量寄存器,成本极低。
- 三类实体在并发行、并发单元数量、通信复杂度的取舍。
进程是资源分配的基本单位,每个进程拥有独立的虚拟地址空间、文件描述符表、信号处理器等,进程间切换需要切换页表导致 TLB 失效,且需进入内核态,成本最高。线程是轻量级进程,是 CPU 调度的最小单位,同一进程内的线程共享地址空间与大部分资源,切换只需切换内核栈与寄存器,无需切换页表,成本显著低于进程。协程是用户态可见的协作式并发单元,由用户态调度器(如 Go 的 runtime、Python 的 asyncio)管理,切换完全在用户态完成,只保存少量非易失寄存器与栈指针,成本最低(纳秒级)。从地址空间看,进程彼此隔离、线程共享、协程共享;从调度主体看,进程与线程由内核调度、协程由用户态库调度;从切换成本看,进程 > 线程 > 协程。
三者的本质差异源自"资源与调度的绑定关系"。进程把资源隔离与调度捆绑在一起,代价是隔离带来的切换开销;线程把调度从资源隔离中剥离出来,共享资源换取低成本切换;协程进一步把调度移动到用户态,由编译器/运行时自行管理,代价是单核内无法真正并行(仍需底层线程支撑)。理解这一条主线能解释为何现代语言(Go、Rust async)普遍采用"轻量级用户态任务 + 少量内核线程"的组合模型。