03 - 程序 vs 进程 vs 线程
这是面试最爱问、也最容易搞混的一组概念。别背定义,用一个类比一次讲透。
一个做菜的类比
- 程序:一份菜谱。它只是写在纸上的一套步骤,静静躺在硬盘上,本身不干活。(比如 D 盘里的
微信.exe文件。) - 进程:按菜谱真正在做菜的这个过程。你把菜谱拿到厨房,备好食材、开火操作,这才「活」起来。(你双击
微信.exe,它跑起来了,就成了一个进程。) - 线程:厨房里同时干活的那几双手。一个大厨可以左手切菜、右手看火,多双手一起推进同一道菜。
一句话:
程序是静态的代码,进程是程序跑起来后的一次「执行活动」,线程是进程内部具体干活的执行单元。
进程:资源分配的基本单位
当程序变成进程,操作系统会给它一整套「家当」:
- 一块独立的内存空间(放它的代码、数据、变量)
- 打开的文件、网络连接等资源
- 它自己的运行状态
关键点:进程之间是相互隔离的。微信进程崩了,不会连累你的浏览器进程——因为它俩住在各自独立的内存空间里,互相看不见、碰不着。这正是上一章说的「保安」在起作用。
一个进程 = 一间独立的厨房,有自己的灶台、食材、案板,别的厨房烧糊了也波及不到你。
线程:CPU 调度的基本单位
一个进程里,可以有多个线程,它们共享同一个进程的内存和资源(同一间厨房里的几双手,用的是同一批食材和灶台)。
为什么要有线程?因为很多任务可以并行推进:
- 浏览器:一个线程渲染页面,一个线程下载图片,一个线程响应你的点击——你才不会觉得卡。
- 如果只有一双手(单线程),下载大图时整个页面就卡死不动了。
进程 vs 线程:核心区别
| 进程 | 线程 | |
|---|---|---|
| 是什么 | 一次程序执行活动 | 进程内的执行单元 |
| 内存 | 各自独立、互相隔离 | 同进程内共享 |
| 开销 | 大(要分配整套资源) | 小(共用进程的资源) |
| 崩溃影响 | 一个进程崩,不连累别的进程 | 一个线程崩,可能拖垮整个进程 |
| 通信 | 麻烦(隔离着,要专门机制) | 简单(直接共享数据) |
一句话记忆:
进程之间是「隔离」的,安全但沟通麻烦;线程之间是「共享」的,高效但容易互相干扰。
那个「容易互相干扰」正是麻烦的来源——多个线程共用数据,一起改就可能出乱子。这个坑我们放到第 06 章专门讲。
小结
- 程序:躺在硬盘上的静态代码(菜谱)。
- 进程:程序跑起来的一次执行活动(在做菜的过程),是资源分配的基本单位,进程间相互隔离。
- 线程:进程内部干活的执行单元(几双手),是 CPU 调度的基本单位,同进程的线程共享内存。
- 隔离带来安全,共享带来效率——这是理解并发问题的总钥匙。
下一章 → 04 - CPU 凭什么能同时跑很多程序 | 回到 README 目录