我们可以把计算机比作一个大工厂从资源管理和执行效率两个维度来拆解。先上核心结论进程是“资源分配”的最小单位线程是“CPU调度”的最小单位而协程是“用户态”的轻量级执行单元。1. 进程Process工厂里的“独立车间”是什么进程是操作系统进行资源分配内存、文件句柄、网络端口的基本单位。它是正在运行的程序的一个实例。工厂类比相当于一个独立的车间。每个车间都拥有自己完整的地盘独立的内存空间、物料数据和机器资源。核心特点隔离性独立性进程间的内存是相互隔离的。车间 A 无法直接访问车间 B 的内存如果 A 崩溃了完全不影响 B所以多进程安全性最高。重量级创建和销毁一个进程需要操作系统分配大量的系统资源页表、PCB控制块等开销很大。切换成本高CPU 从一个进程切换到另一个进程需要保存当前全部运行状态还要刷新缓存TLB速度较慢。2. 协程Coroutine / Goroutine车间里的“流水线工人”是什么协程是比线程更轻量级的用户态执行单元。它完全由编程语言运行时如 Go 的调度器进行管理和调度而不是由操作系统内核管理。工厂类比相当于车间里一个个灵活的兼职工人针对 Go 的 Goroutine则是“超轻量虚拟工人”。他们没有固定的工位栈空间极小Go 中初始仅 2KB可以随时被组长安排到某个机器上干活干完立刻让出位置。核心特点轻量且高效用户态调度创建、销毁、切换都在用户态完成不陷入内核态不涉及系统调用速度极快纳秒级。栈空间动态伸缩内存占用极小且能自动扩容一台普通的 16GB 服务器轻松创建几十万甚至上百万个有别于我们之前纠正的“10万”误区。非抢占式/协作式通常大多数协程需要主动让出执行权Go 的 Goroutine 在阻塞 I/O 或调用runtime.Gosched时会自动让出。关键区分进程、线程、协程的终极对比为了帮你彻底理清这里加上线程Thread来做对比线程是进程内的执行者属于内核级调度维度进程线程协程管理方操作系统内核操作系统内核用户态语言运行时如 Go runtime资源隔离性完全隔离独立内存空间共享进程的内存空间堆、全局变量完全共享所属线程/进程的内存空间上下文切换成本极高涉及虚拟内存切换、TLB刷新较高内核态切换需保存寄存器极低仅保存少量寄存器用户态切换内存占用很大通常 GB 级虚拟内存中等MB 级默认栈空间极小Go 初始仅 2KB可动态扩容创建/销毁成本极重需 fork 系统调用较重需 pthread_create 系统调用极轻纯内存分配无系统调用崩溃影响互不影响隔离导致整个进程崩溃共享内存导致所在线程/进程崩溃并发模型仅用于多核并行重量级内核级抢占式调度用户态协作式/多对多调度GMP 模型在 Go 语言的 GMP 模型中三者的关系是进程是操作系统分配的大房子内存空间。线程M是房子里正在干活的正式工人操作系统线程由内核派发工资CPU 时间片。Goroutine协程是工人手里不断处理的具体任务单。Go 调度器P负责决定让哪个任务单交给哪个工人去执行。一句话总结进程管“地”资源线程管“人”内核执行协程管“活”用户态任务。Go 的高并发就是用极其廉价的协程任务巧妙地挂载在少量昂贵的线程工人身上从而榨干 CPU 性能。