二、进程与线程(工作最高频)
⭐⭐⭐⭐⭐ 面试最高频章节(Java、Linux、操作系统、后端开发必考)
本章重点:
- 进程与线程
- PCB
- 进程状态
- 调度算法
- 并发与同步
- 死锁
- IPC 通信
一、进程(Process)
1. 什么是进程?
进程(Process) 是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。
简单来说:
程序是静态的,进程是动态运行的。
例如:
电脑中打开:
微信QQChromeIDEA
每一个运行的软件都是一个进程。
2. 程序和进程区别
| 程序 | 进程 |
|---|---|
| 静态 | 动态 |
| 存放在磁盘 | 运行在内存 |
| 不占CPU | 占CPU、内存 |
| 可以有多个进程 | 是程序运行后的实例 |
例如:
QQ.exe
只是程序。
打开两个QQ:
QQ① QQ②
就是两个不同的进程。
二、线程(Thread)
1. 什么是线程?
线程(Thread):
CPU 调度的最小单位。
线程属于进程。
一个进程可以包含多个线程。
例如:
Chrome 浏览器
Chrome ├── 页面渲染线程├── 网络线程├── JavaScript线程├── GPU线程└── 音频线程
这些线程共享同一个进程资源。
2. 为什么需要线程?
假如没有线程:
下载文件时:
浏览器 ↓ 只能等待下载完成 ↓ 页面卡死
有线程:
下载线程 + 页面渲染线程 + 网络线程
页面依旧可以正常浏览。
三、进程和线程区别(★★★★★)
这是面试最高频。
| 项目 | 进程 | 线程 |
|---|---|---|
| 定义 | 资源分配单位 | CPU调度单位 |
| 是否独立 | 独立 | 属于进程 |
| 地址空间 | 独立 | 共享 |
| 创建开销 | 大 | 小 |
| 切换开销 | 大 | 小 |
| 通信 | IPC | 共享变量 |
| 崩溃影响 | 不影响其他进程 | 可能导致整个进程退出 |
口诀:
资源归进程,调度看线程。
四、PCB(Process Control Block,进程控制块)
PCB:
操作系统管理进程的重要数据结构。
可以理解成:
每个进程的"身份证"。
没有 PCB,
操作系统就不知道:
它是谁? 运行到哪里? 占了多少内存? 优先级是多少?
PCB包含哪些内容?
主要包括:
① 进程ID(PID)
例如:
PID=1001 PID=1002
Linux:
bashps -ef
可以看到 PID。
② 进程状态
例如:
运行 等待 阻塞
③ 程序计数器(PC)
记录:
CPU执行到哪一条指令。
切换回来继续执行。
④ CPU寄存器
保存:
CPU现场。
例如:
AX BX CX DX
⑤ 内存信息
例如:
代码区 数据区 堆 栈
⑥ 打开的文件
例如:
a.txt b.jpg socket连接
五、进程状态(★★★★★)
经典五状态模型。
创建 ↓ 就绪 Ready ↓ 运行 Running ↙ ↘阻塞 Waiting 结束 Terminated
① 新建(New)
刚创建。
例如:
fork() CreateProcess()
② 就绪(Ready)
已经准备好了。
等待CPU。
例如:
QQ 微信 IDEA
都在等待CPU。
③ 运行(Running)
CPU正在执行。
注意:
一个CPU核心:
同一时刻只能运行一个线程。
④ 阻塞(Blocked)
等待某个事件。
例如:
等待磁盘 等待网络 等待用户输入
CPU不会一直等。
而是:
去执行别的进程。
⑤ 结束(Terminated)
程序退出。
例如:
exit() return 0;
PCB被释放。
六、进程创建与销毁
创建
Linux:
cfork();
Windows:
CreateProcess()
创建过程:
申请PCB ↓ 申请内存 ↓ 加载程序 ↓ 进入就绪队列
销毁
例如:
程序退出 kill 异常崩溃
操作系统:
释放内存 ↓ 关闭文件 ↓ 删除PCB
七、CPU调度(Scheduling)
多个进程:
QQ IDEA Chrome 微信
CPU:
到底先执行谁?
由:
CPU调度算法
决定。
八、时间片(Time Slice)
时间片:
CPU一次允许程序运行的时间。
例如:
10ms
流程:
QQ ↓ Chrome ↓ IDEA ↓ 微信 ↓ QQ
由于速度很快:
用户感觉:
像同时运行。
这就是:
时间片轮转。
九、优先级(Priority)
有些程序:
更重要。
例如:
系统进程 杀毒软件 视频播放 后台更新
CPU:
优先执行:
优先级高的程序。
例如:
Priority=10 Priority=1
CPU:
先执行10。
十、常见调度算法(了解)
| 算法 | 特点 |
|---|---|
| FCFS(先来先服务) | 谁先来谁先执行 |
| SJF(最短作业优先) | 时间短优先 |
| 时间片轮转(RR) | 最常见 |
| 优先级调度 | 高优先级先执行 |
| 多级反馈队列 | Linux 常见思想 |
实际系统:
通常组合使用。
十一、并发(Concurrency)
并发:
多个任务:
交替执行。
例如:
QQ ↓ IDEA ↓ Chrome ↓ QQ
注意:
不是同时。
而是:
快速切换。
并行(Parallel)
多个CPU:
真正同时执行。
例如:
CPU1 QQ CPU2 Chrome
并发 vs 并行
| 并发 | 并行 |
|---|---|
| 一个CPU交替执行 | 多CPU同时执行 |
| 宏观同时 | 真正同时 |
十二、临界资源(Critical Resource)
多个线程:
共同访问:
同一个资源。
例如:
余额 库存 数据库 打印机
这就是:
临界资源。
为什么危险?
例如:
余额:
100元
线程A:
取50
线程B:
取30
如果同时操作:
可能得到:
20 50 70
结果错误。
这就是:
数据竞争(Race Condition)。
十三、互斥(Mutex)
互斥:
同一时刻:
只能一个线程访问。
例如:
厕所。
有人 ↓ 锁门 ↓ 别人等待
程序:
线程A ↓ 加锁 ↓ 操作 ↓ 解锁
其他线程:
等待。
常见互斥工具
- Mutex(互斥锁)
- synchronized(Java)
- ReentrantLock
- SpinLock(自旋锁)
十四、同步(Synchronization)
同步:
线程之间:
按顺序执行。
例如:
线程A: 生产数据 ↓ 线程B: 消费数据
必须:
A完成,
B才能开始。
常见同步工具
Java:
wait() notify() CountDownLatch Semaphore Condition
Linux:
Semaphore Mutex Condition Variable
十五、死锁(Deadlock)(★★★★★)
什么是死锁?
两个线程:
互相等待。
谁也不能继续。
例如:
线程A: 拿着锁A 等待锁B
线程B: 拿着锁B 等待锁A
最终:
一直等待。
程序卡死。
四个产生条件(必背)
必须同时满足:
① 互斥
资源只能一个人使用。
② 请求保持
拿着资源,
继续申请新的资源。
③ 不可剥夺
资源不能强制抢走。
④ 循环等待
形成等待环。
例如:
A等B ↓ B等C ↓ C等A
口诀:
互斥、保持、不剥夺、循环等待。
十六、如何避免死锁?
常见方法:
方法一:按顺序加锁(最常用)
统一:
先锁A 后锁B
不要:
A→B B→A
方法二:一次申请全部资源
避免:
边申请边等待。
方法三:设置超时
例如:
Java:
javatryLock(3, TimeUnit.SECONDS);
超时:
放弃锁。
方法四:减少锁
锁越少,
死锁概率越低。
十七、进程通信(IPC,Inter Process Communication)
不同进程:
内存独立。
因此:
不能直接共享变量。
需要:
IPC(进程间通信)
十八、管道(Pipe)
特点:
最简单。
进程A ↓ Pipe ↓ 进程B
特点:
- 半双工
- 父子进程常用
- Linux常见
例如:
bashls | grep txt
就是:
管道。
十九、消息队列(Message Queue)
通过:
消息。
发送 ↓ 消息队列 ↓ 接收
优点:
- 解耦
- 异步
- 不需要同时在线
例如:
订单系统 ↓ MQ ↓ 库存系统
常见:
- RabbitMQ
- RocketMQ
- Kafka(偏消息流)
- ActiveMQ
二十、共享内存(Shared Memory)
多个进程:
共享:
同一块内存。
A ↓ 共享内存 ↑ B
优点:
速度最快。
缺点:
必须加锁。
否则:
数据混乱。
二十一、Socket(★★★★★)
Socket:
网络通信。
不仅:
进程通信。
还能:
跨机器通信。
例如:
浏览器 ↓ Socket ↓ Web服务器
Java:
javaSocket socket = new Socket("127.0.0.1",8080);
TCP、UDP:
都是基于Socket。
二十二、各种IPC方式比较(★★★★★)
| 通信方式 | 是否跨机器 | 速度 | 特点 |
|---|---|---|---|
| 管道(Pipe) | ❌ | 快 | 父子进程 |
| 消息队列 | ❌ | 中 | 异步通信 |
| 共享内存 | ❌ | ⭐最快 | 需要同步机制 |
| Socket | ✅ | 较快 | 网络通信、应用最广 |
二十三、本章重点总结(必背)
进程 vs 线程
| 进程 | 线程 |
|---|---|
| 资源分配单位 | CPU调度单位 |
| 独立地址空间 | 共享地址空间 |
| 创建开销大 | 创建开销小 |
| 通信需要IPC | 共享变量即可 |
PCB
PCB记录:
- PID
- 状态
- 程序计数器
- CPU寄存器
- 内存信息
- 打开文件
五状态模型
新建 ↓ 就绪 ↓ 运行 ↙ ↘ 阻塞 结束
调度基础
- 时间片轮转
- 优先级调度
- FCFS
- SJF
- 多级反馈队列
并发问题
- 临界资源
- 数据竞争
- 互斥(Mutex)
- 同步(Synchronization)
死锁四个条件(口诀)
互斥、保持、不剥夺、循环等待。
IPC 通信
| IPC | 场景 |
|---|---|
| Pipe | 父子进程 |
| 消息队列 | 异步消息 |
| 共享内存 | 高性能通信 |
| Socket | 网络通信 |
面试/考试高频问题
Q1:进程和线程有什么区别?
答: 进程是资源分配的基本单位,拥有独立的地址空间;线程是 CPU 调度的基本单位,共享所属进程的资源。线程创建和切换开销更小,适合提高程序并发能力。
Q2:PCB 的作用是什么?
答: PCB(进程控制块)是操作系统管理进程的数据结构,保存进程的 PID、运行状态、程序计数器、CPU 寄存器、内存信息和打开文件等,是进程存在和调度的依据。
Q3:什么是临界资源?为什么要加锁?
答: 临界资源是多个线程或进程共享访问的资源,例如余额、库存、数据库等。如果多个线程同时修改,会产生数据竞争,因此需要通过互斥锁等机制保证同一时刻只有一个线程访问。
Q4:死锁产生需要满足哪些条件?
答: 死锁产生必须同时满足四个条件:互斥、请求保持、不可剥夺、循环等待,只要破坏其中任意一个条件即可避免死锁。
Q5:常见的 IPC 通信方式有哪些?
答: 常见 IPC 包括管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)和 Socket。其中共享内存速度最快,Socket 支持跨主机网络通信,是实际开发中应用最广泛的方式之一。

