进程|线程|协程的区别
2026年9月25日大约 2 分钟
进程|线程|协程的区别
进程
操作系统资源分配的最小单位。
每一个进程有独立的内存空间、独立文件描述符。进程之间天然隔离,一个进程崩溃,一般不会直接干掉别的进程。
Linux 里 FPM 的每一个 worker,就是独立进程。进程之间切换开销很大,因为操作系统要换页表、切换内存上下文。
线程
进程内部的执行单元,一个进程可以开多条线程。
同进程内所有线程共享这块进程的内存空间(堆、全局变量),各自只有独立栈。
线程切换开销比进程小很多;风险就是一个线程写坏共享内存,同进程其他线程跟着遭殃,容易出现竞态问题。
一句话:进程 = 独立房子;线程 = 同一套房子里面的多个人,共用客厅、厨房。
协程(用户态轻量线程,Swoole、Go 都在用)
协程是代码库层面实现的,操作系统内核感知不到它。
跑在一个线程里面,多个协程轮流执行。切换完全不用陷入操作系统内核,切换开销极小。
协程的切换时机由代码主动交出控制权(IO 等待的时候切),不是操作系统抢占调度。
同一线程内协程共享内存,要自己做好并发数据保护。
三者开销对比(从大到小)
进程切换 > 线程切换 > 协程切换
套进熟悉的例子
- PHP-FPM:多进程模型。一个请求交给一个进程,进程之间完全隔离。
- Swoole/Swow:主进程拉起若干工作进程,每个工作进程里面跑大量协程。IO 阻塞的时候自动切协程,一个进程同时处理上千请求。
- Go:goroutine 本质就是协程,Go runtime 在内核线程之上调度大量 goroutine。
最核心的边界区分(记这三句就够)
- 进程:操作系统给你分配独立内存,隔离最强,切换最重。
- 线程:进程之内,共享内存,内核参与调度,切换中等开销。
- 协程:用户态,内核看不见,IO 点主动让出,切换最轻。
