操作系统复习
一 .操作系统中的进程与线程
1. 进程(Process)
- 定义:进程是操作系统资源分配的基本单位,是程序的一次执行实例。每个进程拥有独立的地址空间、代码、数据和系统资源(如文件、内存、CPU 时间等)。
- 特点:
- 独立性:进程之间相互隔离,一个进程崩溃不会直接影响其他进程。
- 资源开销大:创建、切换和销毁进程需要较高的系统开销。
- 通信复杂:进程间通信(IPC)需要借助操作系统提供的机制(如管道、消息队列、共享内存等)。
2. 线程(Thread)
- 定义:线程是 CPU 调度的基本单位,是进程内的一个执行流。一个进程可以包含多个线程,它们共享进程的地址空间和资源。
- 特点:
- 轻量级:线程的创建、切换和销毁比进程更快,资源开销更小。
- 共享资源:同一进程内的线程共享内存、文件等资源,通信更高效。
- 并发执行:多线程可以实现并行计算,提高程序执行效率。
3. 进程 vs. 线程
特性 | 进程 | 线程 |
---|---|---|
资源占用 | 独立地址空间,开销大 | 共享进程资源,开销小 |
创建/切换速度 | 慢 | 快 |
通信方式 | IPC(管道、共享内存等) | 直接共享内存,更高效 |
独立性 | 崩溃不影响其他进程 | 一个线程崩溃可能导致整个进程崩溃 |
适用场景 | 需要高隔离性的任务(如浏览器) | 需要高并发的任务(如Web服务器) |
4. 多线程 vs. 多进程
-
多进程:
- 优点:稳定性高,一个进程崩溃不会影响其他进程。
- 缺点:资源占用大,通信复杂。
- 适用场景:需要高安全性和隔离性的应用(如 Chrome 浏览器采用多进程架构)。
-
多线程:
- 优点:通信高效,资源占用小,适合并发计算。
- 缺点:线程间共享数据可能导致竞争条件(Race Condition),需要同步机制(如锁、信号量)。
- 适用场景:需要高并发的任务(如 Web 服务器、游戏引擎)。
5. 线程同步机制
由于线程共享内存,可能导致数据竞争(Data Race),因此需要同步机制:
- 互斥锁(Mutex):确保同一时间只有一个线程访问共享资源。
- 信号量(Semaphore):控制多个线程对资源的访问数量。
- 条件变量(Condition Variable):让线程等待某个条件满足后再执行。
- 读写锁(Read-Write Lock):允许多个线程同时读,但写操作独占资源。
6. 进程间通信(IPC)方式
由于进程间内存隔离,通信需要特殊机制:
- 管道(Pipe):单向通信,适用于父子进程。
- 消息队列(Message Queue):进程间发送结构化消息。
- 共享内存(Shared Memory):高效,但需要同步机制。
- 套接字(Socket):可用于不同机器间的进程通信。
7. 总结
- 进程:适合需要高隔离性和安全性的任务(如浏览器、数据库)。
- 线程:适合需要高并发和资源共享的任务(如服务器、游戏引擎)。
- 选择:
- 如果任务需要高并发且共享数据 → 多线程。
- 如果任务需要高稳定性 → 多进程。
二 . 死锁(Deadlock)复习笔记
1. 死锁的定义
在操作系统中,死锁指多个进程因竞争资源而陷入互相等待的状态,导致所有进程都无法继续执行。例如:进程A持有资源R1并请求R2,而进程B持有R2并请求R1,两者均无法释放资源,形成僵局。
2. 死锁的必要条件(四个,缺一不可)
- 互斥条件(Mutual Exclusion):资源一次只能被一个进程占用。
- 占有并等待(Hold and Wait):进程持有至少一个资源,同时等待获取其他被占用的资源。
- 非抢占(No Preemption):已分配给进程的资源不能被强制剥夺,必须由进程主动释放。
- 循环等待(Circular Wait):存在一个进程等待环路,如P1→P2→P3→…→Pn→P1。
3. 死锁的处理策略
(1) 预防(Prevention)
破坏四个必要条件之一:
- 破坏互斥:允许资源共享(如只读文件),但某些资源无法共享(如打印机)。
- 破坏占有并等待:要求进程一次性申请所有资源(可能导致资源浪费)。
- 破坏非抢占:允许强制抢占资源(需保存状态,实现复杂)。
- 破坏循环等待:按固定顺序(如资源编号)申请资源(如银行家算法)。
(2) 避免(Avoidance)
- 银行家算法(Banker's Algorithm):
- 检查资源分配后系统是否处于安全状态(存在至少一个安全序列)。
- 需要预先知道进程的最大资源需求。
- 示例:当前可用资源为(3,3,2),若进程P1请求(1,0,2),需检查分配后是否仍能找到一个安全序列(如P1→P3→P4→P2→P0)。
(3) 检测与恢复(Detection & Recovery)
- 检测:通过资源分配图(Resource Allocation Graph, RAG)或矩阵算法检测死锁。
- 若图中存在环路且资源不可抢占,则死锁发生。
- 恢复:
- 进程终止:强制终止所有或部分死锁进程(如终止代价最小的进程)。
- 资源抢占:回滚进程并释放资源(需解决饥饿问题)。
(4) 忽略(Ostrich Algorithm)
- 假设死锁极少发生,如Unix/Linux通常不处理死锁,交由开发者避免。
4. 关键概念对比
预防(Prevention) | 避免(Avoidance) |
---|---|
静态策略,限制资源申请方式 | 动态策略,运行时检查安全性 |
可能降低系统吞吐量 | 需预知最大需求,开销较大 |
5. 典型例题
问题:系统有3类资源(A/B/C),数量为(10,5,7)。当前分配情况如下:
- 进程P0:已占用(0,1,0),最大需求(7,5,3);
- 进程P1:已占用(2,0,0),最大需求(3,2,2);
- 进程P2:已占用(3,0,2),最大需求(9,0,2);
- 进程P3:已占用(2,1,1),最大需求(2,2,2);
- 进程P4:已占用(0,0,2),最大需求(4,3,3)。
问:当前是否安全?若P1请求(1,0,2),能否分配?
解答:
-
计算可用资源:
总资源 = (10,5,7)
已分配 = (0+2+3+2+0, 1+0+0+1+0, 0+0+2+1+2) = (7,2,5)
可用 = (10-7, 5-2, 7-5) = (3,3,2) -
检查安全序列:
- 计算各进程Need = Max - Allocated:
P0:(7,4,3), P1:(1,2,2), P2:(6,0,0), P3:(0,1,1), P4:(4,3,1) - 当前可用(3,3,2)可满足P3的Need(0,1,1),执行后释放资源:
可用 = (3+2,3+1,2+1) = (5,4,3) - 接着可满足P1/P4,最终找到安全序列如 P3→P1→P4→P0→P2,系统安全。
- 计算各进程Need = Max - Allocated:
-
P1请求(1,0,2):
- 检查请求 ≤ Need((1,2,2))且 ≤ 可用((3,3,2)),允许尝试分配。
- 分配后:
P1占用 = (2+1,0+0,0+2) = (3,0,2)
可用 = (3-1,3-0,2-2) = (2,3,0) - 重新检查安全性:可用(2,3,0)可满足P3→P1→...,仍存在安全序列,允许分配。
6. 常见考点
- 判断死锁条件(给出资源分配图或进程描述)。
- 银行家算法的步骤(计算Need、Available,找安全序列)。
- 死锁处理策略的优缺点比较(如预防 vs 避免)。