文章目录
一、处理机调度核心知识体系
1.1 调度的层次性与时机控制
操作系统调度分为三个层次: 高级调度(作业调度) 、 中级调度(内存调度) 和 低级调度(进程调度)。其中,进程调度是其中重点,其触发时机包括进程终止、进程阻塞、时间片用完、I/O中断以及抢占式调度中的优先级变化等场景。
调度过程的本质是上下文切换:保存当前进程状态、选择新进程、恢复新进程状态。该过程需严格保证原子性,防止状态不一致导致系统错误。
1.2 调度准则与评价指标
评价算法优劣的核心指标包括:
- CPU利用率:CPU有效工作时间占比
- 吞吐量:单位时间完成作业数量
- 周转时间(Turnaround Time):从作业提交到完成的总时间,计算公式为 T = 完成时间 - 到达时间
- 等待时间:进程在就绪队列中的累计等待时长
- 响应时间:从请求提交到首次响应的时间间隔
- 公平性:各进程获得CPU时间的均衡程度
这些指标在分析算法时需综合权衡,例如高吞吐量可能伴随长作业的不公平等待。
1.3 经典调度算法深度解析
1.3.1 先来先服务调度算法(FCFS)
原理:严格按进程到达就绪队列的先后顺序分配CPU,属于不可抢占式算法 。
优点:
- 实现简单,公平性直观
- 无饥饿现象,所有进程最终必获服务
缺点:
- 护航效应(Convoy Effect) :短作业被迫等待长作业完成,平均等待时间恶化。例如,若长作业先到达,后续短作业周转时间将显著增加
- 对CPU密集型与I/O密集型进程未作区分,资源利用率低
适用场景:批处理系统或作为其他算法的基准对照。
1.3.2 短作业优先调度算法(SJF)
原理:选择预计执行时间最短的进程优先执行,可分为 抢占式(SRTF, Shortest Remaining Time First) 和非抢占式两种 。
优点:
- 理论最优性:可证明SJF能获得最小平均周转时间
- 系统吞吐量显著提升
缺点: - 长作业饥饿:若短作业持续到达,长作业可能长时间无法执行
- 执行时间预估困难:需依赖历史数据或用户估计,准确性难以保证
- 不公平性:对长作业响应性差
重点:需掌握抢占式SJF的调度过程绘制,以及周转时间、等待时间的精确计算。例如,给定进程到达时间与执行时间,要求绘制甘特图并计算各指标。
1.3.3 时间片轮转调度算法(RR)
原理:将就绪队列组织为FIFO队列,每个进程分配固定时间片(Quantum),时间片用完后强制剥夺CPU并移至队尾。
时间片设计:
- 过大:退化为FCFS,响应性下降
- 过小:上下文切换开销占比过高,系统效率降低
优点:
- 公平性:各进程获得均等CPU时间
- 响应及时:适合交互式系统
缺点:
- 平均周转时间通常劣于SJF
- 进程切换带来的开销不可忽视
要点:需计算给定时间片下的调度序列,并分析时间片大小对性能指标的影响。
1.3.4 优先级调度算法(PSA)
原理:为每个进程分配优先级,调度器选择优先级最高者执行。优先级分为静态(固定不变)和动态(运行时可调整)两类。
动态优先级调整策略:
- 等待时间越长优先级越高:防止饥饿
- 执行时间越长优先级越低:避免长作业垄断CPU
问题:
- 优先级反转:低优先级进程持有高优先级进程所需资源,导致高优先级进程阻塞
- 饥饿:低优先级进程长期无法执行
解决方案:优先级继承协议(Priority Inheritance)、优先级天花板协议。
1.3.5 高响应比优先调度算法(HRRN)
原理:动态计算响应比 R = (等待时间 + 要求服务时间) / 要求服务时间,选择R最高者执行。
特性:
- 融合优势:兼顾SJF的短作业优先和FCFS的长作业公平性
- 自适应性:等待时间越长,响应比越高,防止长作业无限等待
- 非抢占式:进程一旦开始执行便运行至完成
重点:需理解响应比公式中各项的权衡意义,并能计算特定时刻各进程的响应比以决定调度顺序。
1.3.6 多级反馈队列调度算法(MFQ)
原理:将就绪队列分为多级,每级队列拥有不同优先级和时间片大小。新生进程进入最高优先级队列,若未完成则降级至下一级队列。
核心机制:
- 优先级与时间片负相关:高优先级队列时间片短(响应快),低优先级队列时间片长(批处理)
- 降级惩罚:CPU占用久的进程逐步降低优先级
- aging机制:低优先级队列进程等待过久可提升优先级,防止饥饿
优点:
- 自适应性:无需预知进程执行时间
- 综合性:短作业快速完成,长作业也能获得合理CPU时间
- 系统响应性优异:终端交互进程通常能快速完成
二、死锁核心知识体系
2.1 死锁的精确定义与必要条件
死锁是指多个进程因竞争资源而陷入永久阻塞的状态,若无外力干预,这些进程将无法继续推进。
产生的四个必要条件(必须全部满足):
- 互斥条件:资源一次仅允许一个进程占用
- 持有并等待条件:进程已持有至少一个资源,同时等待其他进程占有的资源
- 不可抢占条件:已分配资源不能被强制剥夺,必须由进程主动释放
- 循环等待条件:存在进程等待环路,P1等P2,P2等P3,…,Pn等P1
要点:必须能判断给定资源分配场景是否满足四个必要条件,并理解破坏任一条件即可预防死锁。
2.2 死锁处理策略全景图
操作系统面对死锁有四种基本策略:
| 策略 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 预防(Prevention) | 破坏死锁四个必要条件之一 | 严格保证系统不死锁 | 资源利用率低,进程行为受限 | 实时系统、关键任务 |
| 避免(Avoidance) | 动态检查资源请求,确保系统始终处于安全状态 | 资源利用率高 | 算法复杂,需预知最大资源需求 | 批处理系统、资源分配明确 |
| 检测与恢复(Detection & Recovery) | 定期检测死锁,发现后强制恢复 | 资源利用率最高 | 恢复代价大,可能造成数据不一致 | 通用操作系统(如UNIX) |
| 忽略(Ignore) | 假设死锁不会发生 | 无开销 | 风险极高 | 个人计算机、开发环境 |
重点:需理解各策略的本质区别,特别是预防与避免的策略差异——预防是静态破坏条件,避免是动态规避风险。
2.3 死锁预防的具体实现
通过破坏四个必要条件实现:
① 破坏互斥条件:将独占资源改造为共享资源。例如,SPOOLing技术将打印机虚拟化为共享设备。但该方法不适用于所有资源(如临界区代码)。
② 破坏持有并等待条件:要求进程一次性申请所有资源,否则不得开始执行。缺点:
- 进程需预知全部资源需求
- 资源利用率极低,进程长期占用未使用资源
③ 破坏不可抢占条件:允许抢占已分配资源。例如,高优先级进程可强制剥夺低优先级进程的资源。但需解决数据一致性问题,实现复杂。
④ 破坏循环等待条件:对资源类型全局编号,进程必须按递增顺序申请资源。该方法效果显著,但限制了进程编程灵活性。
2.4 死锁避免与安全状态
核心思想:资源分配前进行安全性检查,仅当系统保持安全状态时才分配资源。
安全状态定义:存在至少一个安全序列 <P1, P2, …, Pn>,使得对每个进程Pi,其剩余资源需求可被当前可用资源加上所有Pj(j < i)已持有的资源满足。若不存在安全序列,则系统处于不安全状态。
重要结论:安全状态一定不会发生死锁,但不安全状态未必已死锁,而是存在死锁风险。
2.5 银行家算法深度剖析
银行家算法是死锁避免的经典实现,要求每个进程预先声明最大资源需求 Max[i,j]。
数据结构:
- Available[j] :资源类j的当前可用数量
- Allocation[i,j] :进程i已分配资源j的数量
- Need[i,j] = Max[i,j] - Allocation[i,j] :进程i仍需资源j的数量
算法流程:
- 请求检查:若 Request_i ≤ Need_i,否则出错
- 可行性检查:若 Request_i ≤ Available,否则等待
- 试探分配:修改 Available -= Request_i, Allocation_i += Request_i, Need_i -= Request_i
- 安全性检查:调用安全性算法,若找到安全序列则确认分配,否则回滚并阻塞进程
安全性算法:
- 初始化 Work = Available,Finish[i] = false
- 寻找满足 Finish[i] = false 且 Need_i ≤ Work 的进程i
- 若找到,则 Work = Work + Allocation_i,Finish[i] = true,重复
- 若所有 Finish[i] = true,则系统安全
2.6 死锁检测与恢复
检测:通过资源分配图简化法或矩阵法定期检查系统状态。若资源分配图中存在不可简化的环路,则死锁已发生。
恢复策略:
- 进程终止:强制终止部分死锁进程直至环路消除
- 资源抢占:选择牺牲品进程,强制回收其资源
- 回滚:将进程回滚至先前的检查点
缺点:恢复代价高,可能造成数据损失或计算浪费,故实际系统较少采用。
1万+

被折叠的 条评论
为什么被折叠?



