进程(Process)和线程(Thread)是操作系统中最基本的执行单元,核心区别在于:进程是资源分配的基本单位,线程是 CPU 调度的基本单位。简单说,进程管“内存、文件、资源”,线程管“跑代码”。
一、进程(Process)
- 定义:一个正在运行的程序实例,拥有独立的内存空间(代码段、数据段、堆、栈)。
- 特点
- 独立地址空间,进程间互不干扰,一个进程崩溃不会影响其他进程。
- 创建/销毁/切换开销大(要分配内存、页表等)。
- 进程间通信(IPC)需借助管道、消息队列、共享内存、Socket 等机制。
- 类比:一间独立的工厂,有自己的地皮、仓库、水电。
二、线程(Thread)
- 定义:进程内的一个执行流,是 CPU 调度的最小单位。同一进程的线程共享该进程的内存和资源。
- 特点
- 共享进程的地址空间(代码、全局变量、堆),但各有独立的栈和寄存器。
- 创建/切换开销小,通信方便(直接读共享变量,但要加锁防竞态)。
- 一个线程崩溃(如段错误)可能导致整个进程挂掉。
- 类比:工厂里的工人,共享工厂的地皮和设备,各自干不同的活。
三、核心对比
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源归属 | 资源分配基本单位 | 不独占资源,共享所属进程 |
| 地址空间 | 独立 | 共享进程空间 |
| 调度单位 | 不是(内核调度进程,再选线程) | 是(CPU 调度线程) |
| 开销 | 大 | 小 |
| 通信 | IPC 复杂 | 直接共享内存,需同步 |
| 隔离性 | 强,互不影响 | 弱,一损俱损 |
| 典型数量 | 几十~几百 | 成百上千 |
四、为什么要有线程
单进程里想同时做多件事(比如边下载边渲染界面),早期只能开多进程,但太重。线程让**“在一个地址空间内并发执行多个任务”**成为可能,既保留并发能力,又把切换成本降下来。
五、常见变体
- 协程(Coroutine):用户态轻量级线程,由程序自己调度,不进内核,切换成本极低(如 Go 的 goroutine、Python asyncio)。
- 纤程(Fiber):Windows 下的用户态线程概念,类似协程。
- 多线程模型:
- 1:1(一个用户线程对应一个内核线程,Linux pthread 默认)—— 真并行,但创建有上限。
- N:1(N 个用户线程对应 1 个内核线程)—— 切换快,但一个阻塞全阻。
- N:M(Go 运行时采用)—— 兼顾并行与开销。