进程、线程、协程:三个概念别再搞混了

时间:2026-06-08 23:01:51   阅读:18

面试问、工作中也经常提,但很多人把进程、线程、协程混为一谈。搞清楚它们的区别,才能理解并发编程的底层逻辑。

进程:操作系统分配资源的最小单位

每次启动一个程序,操作系统就创建一个进程。每个进程有独立的内存空间、文件描述符、环境变量。进程之间互相隔离,一个进程崩了不会影响另一个。Chrome浏览器每个标签页就是一个独立进程,所以一个标签页崩溃不会拖垮整个浏览器。创建和切换进程的开销最大,因为要切换整个内存空间。

线程:CPU调度的最小单位

一个进程可以包含多个线程,它们共享同一个进程的内存空间。线程之间的通信不需要走IPC(进程间通信),直接读写共享变量就行,但也因此容易出竞态条件。创建和切换线程比进程轻量得多,但仍然涉及用户态和内核态的切换,开销不算小。Java的Thread、Python的threading都是操作系统级线程。

协程:用户态的轻量级线程

协程完全在用户空间运行,操作系统根本不知道它的存在。切换协程不需要陷入内核,只需要保存和恢复几个寄存器的状态,开销是线程的几十分之一。Go的goroutine、Python的asyncio、Kotlin的协程都是这个思路。一个程序可以轻松跑几十万个协程,但几十万个线程早就把系统资源耗光了。

适用场景

进程适合需要强隔离的场景:浏览器标签页、不同服务之间。线程适合CPU密集型任务:图像处理、科学计算,可以利用多核并行。协程适合IO密集型任务:Web服务器、数据库查询、网络请求,因为大部分时间在等IO,协程可以在等待时切换去做别的事。现代高并发服务器(Nginx、Go的net/http)基本都是协程模型。

一个常见误区

Python的GIL(全局解释器锁)让多线程无法利用多核CPU做并行计算,所以Python做CPU密集型任务要用多进程(multiprocessing),而不是多线程。但IO密集型任务用协程(asyncio)反而比多线程更高效,因为协程切换的开销远小于线程。这也是为什么Python的高性能Web框架(FastAPI、aiohttp)都走协程路线。

上一篇:对象存储、块存储、文件存储:三种存储到底怎么选

下一篇:AI编程助手2026:Cursor、Copilot、Claude Code到底怎么选