# 第三章 中断与处理机调度 > 本章是操作系统的核心章节。**操作系统是中断驱动的(Interrupt driven)**——没有中断,操作系统就失去了"驱动"事件的能力。本章围绕"中断"和"处理机调度"两大主题展开,几乎覆盖了 CPU 管理活动的所有重要机制,是考试必考章节。 --- ## 一、知识讲解 ### 3.1 中断与中断系统 #### 3.1.1 中断的概念 **中断**是指处理机在运行过程中,出现了某一事件,必须中止正在运行的程序,转去处理这个事件,处理完毕后再返回原来运行的程序的过程。 - **通俗理解**:CPU 正在执行一个程序,突然来了件急事(比如用户敲了键盘、I/O 设备完成了、程序出错了),CPU 必须停下当前活儿,处理这件事,处理完再回来继续。 - **学术定义**:指 CPU 暂停现行程序的执行,转去执行处理某个突发事件的程序,处理完再返回原程序断点继续执行的过程。 - **三要素**:① 中断源(事件源)② 中断响应(保存现场、转向处理程序)③ 中断返回(恢复现场、继续执行) **中断系统** = **中断装置**(硬件) + **中断处理程序**(软件)。 - 硬件负责:发现中断、响应中断、保存 PC/PSW、转向处理程序。 - 软件负责:识别中断原因、具体处理、返回。 #### 3.1.2 中断装置 **中断装置**是发现并响应中断的硬件机构,主要功能: 1. **识别中断源**,当有多个中断源同时请求时,按**紧迫程度**排队。 2. **保存现场**(核心是 PSW 和 PC,硬件自动完成)。 3. **引出中断处理程序**(即根据中断向量,转去执行对应的处理程序)。 **中断响应的处理过程**(经典图示): ``` 正在运行的用户程序 P (1) 发生中断事件 (2) 硬件保存 PSW, PC 到系统栈 (3) 根据中断向量装载新 PSW', PC' (4) 转入中断处理程序 (5) 中断处理程序完成 (6) 从系统栈恢复 PSW, PC (7) 返回原程序继续执行 ``` **关键寄存器**: - **PC(程序计数器)**:下一条要执行的指令地址 - **PSW(程序状态字)**:包含处理机状态信息(如用户态/管态、中断允许位、条件码等) ##### 3.1.2.1 中断源与中断字 - **中断源**:引起中断的事件。 - **中断寄存器**:保存与中断事件相关信息的寄存器。 - **中断字**:中断寄存器的内容。例:I/O 中断对应设备状态寄存器。 ##### 3.1.2.2 中断类型与中断向量 **中断分类**(重要考点,必须掌握): | 分类标准 | 类型 | 说明 | |---|---|---| | **按产生方式** | **强迫性中断** | 运行程序不期望的中断,由外部/异常事件引发 | | | **自愿性中断**(访管中断) | 运行程序期望的中断,由用户程序主动执行系统调用 | | **按来源** | 硬件中断(外部) | 时钟、I/O、控制台、硬件故障 | | | 软件中断(内部) | 程序性中断、访管中断 | **强迫性中断的具体类型**: 1. **时钟中断**:硬时钟周期性触发(如 5ms),用于进程管理、超时控制 2. **I/O 中断**:I/O 设备完成、传输错误等 3. **控制台中断**:操作员通过控制台按键产生 4. **硬件故障中断**:电源故障(power failure)、内存校验错 5. **程序性中断**:越界、越权、缺页、溢出、除以 0、非法指令等 **自愿性中断**: - 由运行程序主动通过**访管指令**(SVC n)触发 - 用于实现**系统调用**(System Call),如 `fd = open(fname, mode)` - 过程:准备参数 → SVC n → 取返回值 **中断向量**:中断处理程序的运行环境与入口地址(**PSW, PC 的二元组**)。 - 每类中断事件对应一个中断向量 - 中断向量的**存放位置由硬件规定**(如固定在内存低端 0x0000 起的若干单元) - 中断向量的**内容由 OS 在系统初始化时填入** - 中断向量所指的 PSW 应为**系统态(管态)** **典型中断向量表**(假设每项 8 字节): | 地址 | 内容 | |---|---| | 0000 | 时钟中断向量 (PSW1, PC1) | | 0008 | I/O 中断向量 (PSW2, PC2) | | 0016 | 控制台中断向量 (PSW3, PC3) | | 0024 | 硬件故障向量 (PSW4, PC4) | | 0030 | 程序错误向量 (PSW5, PC5) | | ... | ... | | 0090 | 访管中断向量 (PSWn, PCn) | ##### 3.1.2.3 中断嵌套与系统栈 **中断嵌套**(Interrupt Nesting):高优先级中断可以打断低优先级中断处理。 - **实现原则**:高优先级别中断可嵌入低优先级中断。 - **实现方法**:中断响应后立即**屏蔽**不高于当前中断优先级的中断源。 **系统栈**(System Stack)的用途:用于保存中断/嵌套时的现场。 **中断处理的标准流程**(必须熟记): ``` 中断响应后: (1) 关中断(屏蔽所有中断,或仅屏蔽低优先级) (2) 进一步保存现场(通用寄存器等到系统栈) (3) 开中断(开放高优先级中断) ← 允许嵌套 (4) 中断处理 ... (5) 关中断 (6) 恢复现场(从系统栈恢复寄存器) (7) 开中断 (8) 中断返回(iret) ``` **系统栈中的内容(自底向上)**: ``` 栈顶 → PSW1, PC1 (最内层中断的现场) PSW2, PC2 ... PSWn, PCn (最外层中断的现场) 栈底 ``` ##### 3.1.2.4 中断优先级与中断屏蔽 - **中断优先级**:硬件规定的中断响应次序,依据是**紧迫程度**和**处理时间**。 - **中断屏蔽**: - 高优先级中断处理不受低优先级中断打扰 - **程序**可以调整中断响应次序(通过设置屏蔽位) #### 3.1.3 中断处理程序 中断处理程序是处理中断的软件部分,其**通用流程**: | 步骤 | 强迫性中断 | 自愿性中断(系统调用) | |---|---|---| | 1 | 保存现场信息 | 保存现场信息 | | 2 | 取中断字 | 取调用号 | | 3 | 分析中断原因 | 分析何种系统调用 | | 4 | 中断处理 | 执行相应系统调用 | | 5 | 系统栈恢复现场 | 系统栈恢复现场 | | 6 | 返回上层中断或目态程序 | 返回目态程序 | | 7* | 需要切换进程?→ 转 dispatcher | (同上) | **完整流程(含开关中断)**: ``` 强迫性中断处理程序: (1) 关中断 (2) 保存现场到系统栈 (3) 取中断字 (4) 分析中断原因 (5) 开放高优先级中断 (6) 进一步处理 (7) 关中断 (8) 恢复现场 (9) 开中断 (10) 中断返回 自愿性中断处理程序: (1) 关中断 (2) 保存现场到系统栈 (3) 取调用号 (4) 分析何种系统调用 (5) 开放高优先级中断 (6) 执行系统调用 (7) 关中断 (8) 恢复现场 (9) 开中断 (10) 中断返回 ``` ##### 3.1.3.1 I/O 中断处理 - **正常结束**:继续传输;唤醒相关等待进程(修改 PCB 状态为就绪)。 - **传输错误**:复执(如 3 次);若仍失败,报告系统操作员。 ##### 3.1.3.2 时钟中断处理 时钟中断是**最重要的中断**之一,主要做四件事: 1. **Housekeeping(内务处理)**:维护系统时间、更新各种时间戳。 2. **进程管理**: - 重新计算进程调度参数(如动态优先数) - 实现软时钟(如硬时钟 5ms 中断一次,软时钟 50ms 触发一次定时程序) - 死锁检测 3. **考虑进程切换**(时钟中断是最常见的进程切换触发点之一)。 ##### 3.1.3.3 控制台中断处理 一个控制按钮 → 一个中断向量 → 一个中断处理程序。 操作员通过控制台干预操作系统。 ##### 3.1.3.4 硬件故障处理 - **电源故障**: - 掉电:内存/寄存器内容 → 外存;停止设备、处理机 - 恢复:启动处理机、设备;外存 → 内存、寄存器 - 关键应用使用 UPS(不间断电源) - **内存故障**:海明校验、奇偶校验错误;划出系统;报告操作员。 ##### 3.1.3.5 程序性中断的处理 | 类型 | 处理方式 | |---|---| | **只能由 OS 处理**(影响系统或其它进程) | 越界、非法指令:终止进程、调试 | | **需要系统管理或协助** | 页故障、缺段:动态调入 | | **可由用户自己处理**(不影响系统/其它进程) | 除 0、溢出:用户处理或 OS 处理 | **用户自行处理中断的机制**(以除 0 中断为例): 调试语句语法:`on <中断条件> <中断续元入口>` 例:`on goto LA;` —— 除 0 时转 LA 处理 **实现机制**: 1. **编译时**:生成**中断续元表**(初始全 0)。 2. **运行时**:执行调试语句,填写中断续元表(将入口地址写入对应项)。 3. **中断发生时**:查中断续元表 - 若为 0:用户未规定中断续元,由 OS 标准处理 - 若非 0:用户已规定中断续元,由用户处理 **用户处理中断的标准过程**(10 步): 1. 发生溢出中断 2. 保存旧 PSW 和 PC 3. 取中断向量 4. 转到中断处理程序 5. 访问中断续元表(假定非 0) 6. 系统栈中现场转移到用户栈 7. 中断续元入口送寄存器(OS 中断处理完成) 8. 执行中断续元 9. 用户栈 PSW 和 PC 送寄存器 10. 返回中断断点 ##### 3.1.3.6 自愿性中断的处理(系统调用) - **访管指令(SVC, SuperVisor Call)形式**: 1. 准备参数 2. SVC n 3. 取返回值 - **系统调用(System Call)形式**: - `返回值 = 系统调用名称(实参1, ..., 实参n)` - 如 `fd = open(fname, mode)` - 参数和返回值的**存放位置由 OS 规定**(通常通过寄存器或特定内存区)。 - **系统调用驱动表**(table driven):OS 维护一张表,调用号 n 索引到对应处理程序(如 UNIX)。 #### 考虑系统状态的进程状态转换图 下图把进程状态和中断事件关联起来: ``` ┌────────┐ 调度选中 ┌──────┐ 创建→│ 就绪 │←───────│运行 │←──┐ └────┬──┘ └──┬───┘ │ 时间片到 │ 事件发生 │ 中断/剥夺 (剥夺) │ (唤醒) ↓ ┌────▼──┐ ┌──────┐ │等待 │────────→│就绪 │ (返回置 PSW) └───────┘ └──────┘ 终止↓ 退出 ``` > 注意:**就绪态和运行态的转换**主要受**调度**和**中断/剥夺**控制;**运行态到等待态**由程序主动等待事件引起;**等待态到就绪态**由事件发生后的中断唤醒。 --- ### 3.2 处理机调度 处理机调度要回答三个问题: - **3.2.1 调度算法**:按什么原则分配处理机? - **3.2.2 调度时机**:何时重新分配? - **3.2.3 调度过程**:如何完成分配? #### 3.2.1 处理机调度算法 **调度准则(Scheduling Criteria)**——三个都要最大化/最小化: | 指标 | 目标 | 说明 | |---|---|---| | **CPU 利用率** | 最大化 | CPU 忙的时间比例 | | **吞吐量(Throughput)** | 最大化 | 单位时间内完成的作业/进程数 | | **周转时间(Turnaround Time)** | 最小化 | 完成时间 − 提交/到达时间 | | **响应时间(Response Time)** | 最小化 | 首次响应 − 提交时间(对交互式重要) | | **系统开销** | 最小化 | 调度本身占用的时间和资源 | **关键参数**(必背公式): - **周转时间** = 完成时间 − 到达时间 - **平均周转时间** = 所有作业周转时间的平均值 - **带权周转时间** = 周转时间 / 运行时间 - **平均带权周转时间** = 所有作业带权周转时间的平均值 - **等待时间** = 周转时间 − 运行时间 **CPU burst vs. I/O burst(必考概念)**: - 进程运行呈现**阵发期(Burst Cycle)**: - **CPU burst**:进程使用 CPU 进行计算 - **I/O burst**:进程等待 I/O 完成 - 完整周期:CPU burst, I/O burst, CPU burst, I/O burst, ... - **CPU 调度只考虑处于 CPU burst 的进程集合**。 - **下一个 CPU burst 长度的预测公式**(指数平均法): $$\tau_{n+1} = \alpha t_n + (1 - \alpha) \tau_n$$ 其中 $t_n$ 是最近一次实际 CPU 阵发期长度,$\tau_n$ 是第 n 次的估计值,$\alpha \in [0,1]$。 - $\alpha = 0$:$\tau_{n+1} = \tau_n$(只看历史估计) - $\alpha = 1$:$\tau_{n+1} = t_n$(只看最近一次实际) - 通常取 $\alpha = 0.5$。 **剥夺式 vs. 非剥夺式调度**(重要对比): | 类型 | 特点 | 优缺点 | |---|---|---| | **非剥夺式**(Non-preemptive) | 进程运行直到结束或等待(阻塞) | 实现简单、开销小;响应慢、不适合实时 | | **剥夺式**(Preemptive) | 调度程序可强行把处理机从运行进程手中抢走 | 响应快、适合多用户/实时;切换开销大 | ##### 3.2.1.1 先到先服务(FCFS, First Come First Serve) - 按**进程申请 CPU(就绪)的次序**调度。 - **非剥夺式**。 **例题(PPT 原题)**: | 进程 | 到达时间 | 运行时间 | |---|---|---| | P1 | 0 | 27 | | P2 | 1 | 3 | | P3 | 2 | 5 | **调度顺序**(甘特图): ``` | P1 (27) | P2 (3) | P3 (5) | 0 27 30 35 ``` | 进程 | 到达 | 运行 | 开始 | 完成 | 周转 | 带权周转 | |---|---|---|---|---|---|---| | P1 | 0 | 27 | 0 | 27 | 27 | 1.00 | | P2 | 1 | 3 | 27 | 30 | 29 | 9.67 | | P3 | 2 | 5 | 30 | 35 | 33 | 6.60 | - **平均周转时间** = (27 + 29 + 33) / 3 = **29.67** - **平均带权周转时间** = (1 + 9.67 + 6.6) / 3 ≈ **5.76** **优缺点**: - 优点:**公平**、实现简单。 - 缺点:**短作业等待时间长**(护航效应 Convoy Effect)。 ##### 3.2.1.2 短作业优先(SJF, Shortest Job First) - 按 **CPU burst 长度**调度,长度短者优先。 - **非剥夺式**(标准 SJF);其剥夺式版本即 SRTN。 - 仅在所有任务同时到达时,平均等待时间最优。 **例题(PPT 原题)**: | 进程 | 到达时间 | 运行时间 | |---|---|---| | P1 | 0 | 12 | | P2 | 0 | 5 | | P3 | 0 | 7 | | P4 | 0 | 3 | **调度顺序**(按运行时间升序):P4 → P2 → P3 → P1 ``` | P4 (3) | P2 (5) | P3 (7) | P1 (12) | 0 3 8 15 27 ``` | 进程 | 到达 | 运行 | 开始 | 完成 | 周转 | 带权周转 | |---|---|---|---|---|---|---| | P1 | 0 | 12 | 15 | 27 | 27 | 2.25 | | P2 | 0 | 5 | 3 | 8 | 8 | 1.60 | | P3 | 0 | 7 | 8 | 15 | 15 | 2.14 | | P4 | 0 | 3 | 0 | 3 | 3 | 1.00 | - **平均周转时间** = (27 + 8 + 15 + 3) / 4 = **13.25** - **平均带权周转时间** = (2.25 + 1.6 + 2.14 + 1) / 4 = **1.75** **特点**: - 优点:平均等待时间最短(同时到达时)。 - 缺点:**长作业可能被饿死(Starvation)**。 ##### 3.2.1.3 最短剩余时间优先(SRTN, Shortest Remaining Time Next) - **可剥夺的 SJF**。 - 新进程到达时,若其 CPU burst 比当前进程的剩余时间还短,则抢占 CPU。 **例题(PPT 原题)**: | 进程 | 到达时间 | 运行时间 | |---|---|---| | P1 | 0 | 12 | | P2 | 1 | 9 | | P3 | 3 | 6 | | P4 | 5 | 3 | **调度分析**: - t=0:P1 到达,运行(剩余 12) - t=1:P2 到达,剩余 9 < 12,**P2 抢占**,P1 剩余 11 - t=3:P3 到达,P2 剩余 7 > 6,**P3 抢占**,P2 剩余 7 - t=5:P4 到达,P3 剩余 4 > 3,**P4 抢占**,P3 剩余 4 - t=8:P4 完成(运行 3);此时 P3 剩余 4 < P2 剩余 7 < P1 剩余 11,**P3 运行** - t=12:P3 完成;P2 剩余 7 < P1 剩余 11,**P2 运行** - t=19:P2 完成;**P1 运行** - t=30:P1 完成 **甘特图**: ``` | P1 | P2 | P3 | P4 | P3 | P2 | P1 | 0 1 3 5 8 12 19 30 ``` | 进程 | 到达 | 运行 | 开始 | 完成 | 周转 | 带权周转 | |---|---|---|---|---|---|---| | P1 | 0 | 12 | 0 | 30 | 30 | 2.50 | | P2 | 1 | 9 | 1 | 19 | 18 | 2.00 | | P3 | 3 | 6 | 3 | 12 | 9 | 1.50 | | P4 | 5 | 3 | 5 | 8 | 3 | 1.00 | - **平均周转时间** = (30 + 18 + 9 + 3) / 4 = **15.00** - **平均带权周转时间** = (2.5 + 2 + 1.5 + 1) / 4 = **1.75** - **平均等待时间** = (18 + 9 + 3 + 0) / 4 = **7.5** ##### 3.2.1.4 最高响应比优先(HRN, Highest Response Ratio Next) - **响应比公式**: $$RR = \frac{BT + WT}{BT} = 1 + \frac{WT}{BT}$$ - 其中 BT = Burst Time(运行时间),WT = Wait Time(等待时间)。 - **非剥夺式**。 **特点**: - 短作业优先(WT 小、BT 小 → RR 大)。 - 长作业随等待时间增加,响应比也会增加,**避免饿死**。 - 是 FCFS 和 SJF 的折中。 ##### 3.2.1.5 最高优先数算法(HPF, Highest Priority First) 按**优先数**调度,优先数高者优先。 | 优先数类型 | 特点 | 适用 | |---|---|---| | **静态优先数** | 进程创建时确定,生存期不变 | 批处理系统 | | **动态优先数** | 进程创建时继承,生存期内可修改 | 实时系统 | **剥夺方式**: - **非剥夺式**静态优先数:进程运行到终止或等待。 - **剥夺式**(动/静态)优先数:高优先级进程可抢占 CPU。 **例题(PPT 原题,剥夺式+静态优先数,数字小的优先级高)**: | 进程 | 到达 | 优先数 | 运行 | |---|---|---|---| | P1 | 0 | 0 | 8 | | P2 | 2 | 1 | 5 | | P3 | 4 | 3 | 7 | | P4 | 0 | 2 | 3 | | P5 | 5 | 7 | 2 | **调度分析**(数字小的优先级高,即 P1 > P2 > P4 > P3 > P5): - t=0:P1(0)、P4(2) 到达;P1 优先数 0 最高 → 运行 P1 - t=2:P2 到达,优先数 1 > P1 的 0,**P2 抢占**;P1 剩余 6 - t=3:P2 剩余 4;P3 还没到 - t=4:P3 到达,优先数 3 < P2 的 1,P2 继续;P2 剩余 3 - t=5:P5 到达,优先数 7 < P2 的 1,P2 继续;P2 剩余 2 - t=7:P2 完成;就绪:P1(0,剩6)、P4(2,剩3)、P3(3,剩7)、P5(7,剩2);选 P1 - t=13:P1 还需 0,实际是 t=15 完?等等重新分析 - 重新算:P2 在 t=2 开始,运行 5,到 t=7 完成 - t=7:选 P1(优先数 0),剩 6;t=13:P1 完成 - 等等,PPT 数据是 P1 开始 17 完成 25,即 P1 实际在 t=17 重新开始 仔细看 PPT 表格: | 进程 | 到达 | 运行 | 优先 | 开始 | 完成 | 周转 | 带权周转 | |---|---|---|---|---|---|---|---| | P1 | 0 | 8 | 0 | 17 | 25 | 25 | 3.13 | | P2 | 2 | 5 | 1 | 3 | 17 | 15 | 3.00 | | P3 | 4 | 7 | 3 | 4 | 13 | 9 | 1.29 | | P4 | 0 | 3 | 2 | 0 | 3 | 3 | 1.00 | | P5 | 5 | 2 | 7 | 5 | 7 | 2 | 1.00 | **重新分析**(数字小者优先): - t=0:P1(优0)、P4(优2) 到达。P1 优先数 0 最高,**运行 P1** - t=2:P2(优1) 到达,P2 优先数 1 > P1 的 0,**P2 抢占 P1**;P1 剩 6 - t=3:P4 等待时间久了没轮上,**P4(优2) 仍选 P2(优1)** —— P2 继续 - t=4:P3(优3) 到达,P3 优先数 3 < P2 的 1,P2 继续(剩 3) - t=5:P5(优7) 到达,**等等此时 P2 优先数 1 < P4 优 2 < P3 优 3 < P5 优 7,** P2 继续;P2 剩 2 - 等等,按 PPT 表格 P3 开始 4 完成 13,这是怎么回事? **重新分析 PPT 的逻辑**:可能在 t=4 时刻 P2 时间片用完?或者 t=4 时 P3 抢占? 观察 P2:开始 3、完成 17(运行 14 段时间),起始点 3。P2 到达 2,PPT 显示开始 3(说明等 1),运行 5 应该到 8,但 PPT 说完成 17。 **啊我理解了**:PPT 里 P2 不是连续运行 5,是在 t=3 抢占 P1 然后 P1 在 t=17 重新开始。 让我重新看: - P4 开始 0 完成 3:P4 在 t=0 到 t=3 运行 3。 - P3 开始 4 完成 13:P3 在 t=4 到 t=13 运行 9?不对,P3 运行时间是 7 **重新看数据**:P3 完成 13,开始 4,运行 9?但 burst time 是 7。 实际是 P3 从 t=4 开始,被中断多次:t=4 选 P3(假设),t=5 P5 抢?不对 P5 优 7 < P3 优 3。P3 应一直运行到完成 t=11 但 PPT 说 13。 **实际上 PPT 数据有计算偏差**,但**平均周转 = (25+15+9+3+2)/5 = 10.8**(不是 38.8,PPT 算错了 38.8 是 25+15+9+3+2=54,54/5=10.8,不是 38.8;PPT 表格里 P1 周转 25+15+9+3+2=54,平均=10.8)。这是 PPT 本身的笔误,考试以公式为准。 **正确分析**(优先数小者优先 + 剥夺式): | 时刻 | 事件 | 运行进程 | 就绪队列(按优先数升序) | |---|---|---|---| | 0 | P1(0,8),P4(0,3) 到达 | P1 (优 0) | P4(优 2) | | 2 | P2(优 1) 到达,抢占 | P2 (优 1) | P1(优 0,剩6), P4(优 2) | | 3 | P2 完成 | P1 (优 0,剩6) | P4(优 2) | | 4 | P3(优 3) 到达 | P1 继续 | P4(优 2), P3(优 3) | | 9 | P1 完成 | P4 (优 2) | P3(优 3) | | 12 | P4 完成 | P3 (优 3) | — | | 5 | (同时)P5(优 7) 到达 | (已计入) | | | ... | | | | **甘特图**: ``` | P1 | P2 | P1 | P4 | P3 | P5 | 0 2 3 9 12 19 21 ``` 各进程周转时间: - P1: 9 − 0 = 9 - P2: 3 − 2 = 1 - P4: 12 − 0 = 12 - P3: 19 − 4 = 15 - P5: 21 − 5 = 16 (注意:上述分析以数字小为高优先,PPT 数据有出入。考试请按"题目约定"判断。) **UNIX 动态优先数计算公式**: - `p_pri = min{127, USER + p_cpu/16 + p_nice}` - USER = 100 - p_cpu:运行进程每 20ms 加 1(**优先级降低**),其它进程每 1200ms 减 10(**优先级提高**) - p_nice:可通过 `nice()` 系统调用调整,用户进程 0~20,系统进程 -20~+20 - 调度时取 p_pri **最小**的 ##### 3.2.1.6 循环轮转(RR, Round Robin) - **时间片(Quantum)** 轮转调度。 - **剥夺式**:时间片到则强制切换。 - **适用**:分时系统 **时间片长度**: - 典型值:几十毫秒 ~ 几百毫秒(如 50ms) - **过长**:退化为 FCFS,响应速度慢 - **过短**:系统开销(切换)大 **例题(PPT 原题,时间片 = 4ms)**: | 进程 | 到达 | 运行 | |---|---|---| | P1 | 0 | 17 | | P2 | 0 | 10 | | P3 | 0 | 3 | **调度过程**(时间片 4ms): - t=0~4:P1 运行 4,剩 13 - t=4~8:P2 运行 4,剩 6 - t=8~11:P3 运行 3 完成(不足 4ms 也执行完) - t=11~15:P1 运行 4,剩 9 - t=15~19:P2 运行 4,剩 2 - t=19~23:P1 运行 4,剩 5 - t=23~25:P2 运行 2 完成 - t=25~29:P1 运行 4,剩 1 - t=29~30:P1 运行 1 完成 **甘特图**: ``` | P1 | P2 | P3 | P1 | P2 | P1 | P2 | P1 | P1 | 0 4 8 11 15 19 23 25 29 30 ``` | 进程 | 到达 | 运行 | 开始 | 完成 | 周转 | 带权周转 | |---|---|---|---|---|---|---| | P1 | 0 | 17 | 0 | 30 | 30 | 1.76 | | P2 | 0 | 10 | 4 | 25 | 25 | 2.50 | | P3 | 0 | 3 | 8 | 11 | 11 | 3.67 | - **平均周转时间** = (30 + 25 + 11) / 3 = **22.00** - **平均带权周转时间** = (1.76 + 2.5 + 3.67) / 3 ≈ **2.64** - **平均等待时间** = (13 + 15 + 8) / 3 = **12 ms** ##### 3.2.1.7 多级队列算法(MLQ, Multilevel Queue) - 多个就绪队列,**进程所属的队列固定**。 - 不同队列可用不同算法。 - 队列间可采用固定优先级或时间片轮转调度。 **典型划分**(通用系统): - 队列 1:实时进程(HPF) - 队列 2:分时进程(RR) - 队列 3:批处理进程(HPF) ##### 3.2.1.8 反馈排队算法(FB, Feed-Back / Multilevel Feedback Queue) - 多个就绪队列,**进程所属队列可变**。 - 新进程进入最高优先级队列;若用完时间片未完成则降到下一级。 - 各队列时间片不同(低级队列时间片长)。 - 各队列内部可用 RR 调度。 **调度效果(必背)**: 1. **资源利用率高**:等待资源的进程被唤醒后进入最高级队列,可尽早运行。 2. **响应速度快**:交互式进程经常进入等待,被唤醒后进入最高级,可尽快调度。 3. **系统开销小**:长进程最终落入底层队列,调度频率下降,每次获得较长的时间片。 #### 3.2.2 处理机调度时机 **三种基本时机**: 1. **运行进程结束** 2. **运行进程等待**(如等待 I/O、信号量) 3. **处理机被剥夺**(如时间片到、高优先级进程到达) **按中断类型分类**: | 必然引起进程切换 | 可能引起进程切换 | |---|---| | 进程自愿结束 `exit()` | 时钟中断 | | 进程被强行终止(非法指令、越界、`kill`) | 设备 I/O 中断 | | 进程等待 | 系统调用 | #### 3.2.3 处理机调度过程(Dispatcher) **调度程序(dispatcher)的工作**: 1. **保存下降进程的现场**: - 寄存器(PSW, PC, SP, 通用寄存器, 地址寄存器)→ PCB 2. **选择上升进程**: - 按处理机调度算法 3. **恢复上升进程的现场**: - PCB → 寄存器 - **顺序**:先恢复通用寄存器和地址寄存器,**最后恢复 PSW, PC** - **PSW 和 PC 必须用一条指令同时恢复**(原子操作,避免状态不一致) **为什么 PSW 和 PC 必须一条指令恢复**(课后题): - 因为恢复 PC 后 CPU 立即按 PC 取指执行,若 PSW 还未恢复,处理机仍处于管态,会破坏系统安全。 - 用一条指令同时恢复 PSW 和 PC 可保证从管态切换到目态与 PC 指向用户程序这两件事**原子完成**,避免出现"PC 已指向用户态程序但 PSW 还是管态"的不安全中间状态。 --- ### 3.3 调度级别与多级调度 操作系统的调度分为**三个级别**: | 级别 | 名称 | 调度对象 | 频率 | |---|---|---|---| | **高级调度**(High-Level) | 作业调度 / 宏观调度 | 作业 | 低(分钟级) | | **中级调度**(Mid-Level) | 交换调度 | 内存/外存对换 | 中 | | **低级调度**(Low-Level) | 处理机调度 / 微观调度 | 进程/线程 | 高(毫秒级) | #### 3.3.1 交换与中级调度(Swapping and Mid-level Scheduling) - **交换(Swapping)**:将内存中的进程换出到外存,或将外存中的进程换入到内存。 - **中级调度(Mid-level scheduling)**:决定哪些进程可以参与对换,控制内存中的进程数量。 **并发度(Degree of Multiprogramming)**:内存中并发运行的进程数。 **控制并发度的目标**: | 并发度过高 | 并发度过低 | |---|---| | 系统开销大 | CPU 利用率低 | | 响应速度慢 | 资源浪费 | | 内存等资源紧张 | | | 进程频繁进入等待 | | | 死锁增多 | | **挂起(Suspend)状态**:进程被换出到外存的状态。在状态转换图中,就绪、等待、运行都可挂起。 **UNIX 的中级调度(sched #0)**: - 移入 SRUN 状态进程 - 内存不够: - 先移出 SWAIT 和 SSTOP 状态进程 - 还不够再移出 SSLEEP 和 SRUN 状态进程 - **条件**:待移入进程在外存时间 ≥ 3 秒;待移出进程在内存时间 ≥ 2 秒。 #### 3.3.2 作业与高级调度 **作业(Job)** 是用户提交给系统的一个计算任务单位。**作业状态**: | 状态 | 含义 | |---|---| | **提交** | 作业从输入机向输入井传送 | | **后备** | 作业在输入井,尚未进入内存 | | **执行** | 作业被分解为进程,在内存中处理 | | **完成** | 处理完毕,结果在输出井 | | **退出** | 由输出井向打印机传送 | **状态转换**: ``` 提交 ──SPOOLing 输入──→ 后备 ──作业调度(1)──→ 执行 │ (处理完成)↓ 退出 ←──SPOOLing 输出── 完成 ``` - **提交 → 后备**:由 SPOOLing 输入进程完成(Simultaneous Peripheral Operation On-Line,假脱机) - **后备 → 执行**:由**作业调度(1)**(高级调度)完成 - **执行 → 完成**:由**作业调度(2)**完成 - **完成 → 退出**:由 SPOOLing 输出进程完成 **批处理作业调度程序(1)**:在后备作业集合中**选择作业**,并为其建立作业控制进程。 **批处理作业调度程序(2)**:对**终止的作业控制进程**进行善后处理。 **适合/不适合作业调度的算法**(必背): | 适合批作业调度 | 不适合批作业调度 | |---|---| | FCFS(先到先服务) | RR(时间片轮转) | | HPF(最高优先数) | SRTN(最短剩余时间) | | SJF(短作业优先) | FB(反馈排队) | | HRN(最高响应比) | | > 不适合的原因:作业调度是高级调度,作业在辅存,一次调入会驻留内存较长时间。RR 频繁切换对作业调度无意义;SRTN 需要预测剩余时间,作业层面意义不大;FB 队列可变但作业不能频繁换队列。 --- ### 3.4 实时调度(Real-Time Scheduling) #### 基本概念 - **实时任务**:具有**明确时间约束**的计算任务。 - 某时刻前必须开始处理(**开始截止期**) - 某时刻前必须处理完毕(**完成截止期**) - **实时调度**:合理安排就绪实时任务的执行次序,满足每个实时任务时间约束条件的调度。 #### 实时任务分类 | 分类标准 | 类型 | 说明 | |---|---|---| | **按时间约束严格程度** | **硬实时** | 必须满足任务截止期要求(错过 = 失败) | | | **软实时** | 期望满足截止期要求,偶尔错过可容忍 | | **按发生规律** | **周期性** | 每隔固定时间发生一次 | | | **随机性(非周期)** | 由随机事件触发,发生时刻不确定 | #### 关键术语 | 术语 | 含义 | |---|---| | Ready time | 就绪时间 | | Starting deadline | 开始截止期 | | Processing time (Ci) | 处理时间 | | Completion deadline | 完成截止期 | | Occurring period (Ti) | 发生周期 | | Occurring frequency | 发生频率 | #### 周期性实时任务可调度的必要条件 令 $C_i$ 为任务 $P_i$ 的处理时间,$T_i$ 为任务 $P_i$ 的发生周期,则 $P_1, ..., P_m$ **可调度的必要条件**为: $$\sum_{i=1}^{m} \frac{C_i}{T_i} \leq 1$$ 即所有任务的 CPU 利用率之和 ≤ 1。 **例**:T1=100, T2=200, T3=500 (ms);C1=50, C2=30, C3=100 (ms) - C1/T1 + C2/T2 + C3/T3 = 0.5 + 0.15 + 0.2 = 0.85 < 1 - 满足可调度必要条件(**必要非充分**) #### 3.4.1 最早截止期优先(EDF, Earliest Deadline First) - **优先选择截止期最早的实时任务**。 - **可抢先(Preemptive)**。 - **可调度充分条件**:在不可调度的条件下,可使错过截止期任务**最小化**(最佳努力)。 - **特点**:实现简单,动态优先级,最优调度算法。 **例题(PPT 原题)**: | 任务 | 到达 | 执行 | 完成截止期 | |---|---|---|---| | A1 | 0 | 10 | 20 | | A2 | 20 | 10 | 40 | | A3 | 40 | 10 | 60 | | A4 | 60 | 10 | 80 | | A5 | 80 | 10 | 100 | | B1 | 0 | 25 | 50 | | B2 | 50 | 25 | 100 | EDF 调度结果: ``` 0 10 20 30 40 50 60 70 80 90 100 | A1 | B1 | A2 | B1 | A3 | B1 | A4 | B2 (part) | A5 | B2 | B1完成 50 ``` #### 3.4.2 速率单调调度(RMS, Rate Monotonic Scheduling) - 由 Liu & Layland 于 **1973 年**提出。 - 面向**周期性实时任务**,**非剥夺式**(实际是**静态优先+剥夺**)。 - **优先调度发生周期最短(频度最高)的实时任务**(周期越短,优先级越高)。 - **可调度充分条件**(上限值): $$\sum_{i=1}^{m} \frac{C_i}{T_i} \leq m(2^{1/m} - 1)$$ - 当 m → ∞,上限 → ln 2 ≈ 0.693。 - **RMS 上限值**: | m | 1 | 2 | 3 | 4 | 5 | ... | ∞ | |---|---|---|---|---|---|---|---| | m(2^{1/m} - 1) | 1.000 | 0.828 | 0.780 | 0.757 | 0.743 | ... | 0.693 | **RMS vs. EDF 对比**: | 维度 | RMS | EDF | |---|---|---| | 类型 | 静态优先级 | 动态优先级 | | 可调度条件 | m(2^{1/m} - 1),较严 | 1,宽松 | | 实现 | 较简单 | 较复杂 | | 适用范围 | 周期性任务 | 周期性 + 非周期性 | **RMS 例题(PPT 原题)**: | 进程 | Ti | Ci | |---|---|---| | A | 100 | 20 | | B | 150 | 40 | | C | 350 | 100 | **分析**: - C_i / T_i = 20/100 + 40/150 + 100/350 = 0.2 + 0.267 + 0.286 = 0.753 - m = 3 时上限 = 3 × (2^{1/3} - 1) ≈ 0.780 - 0.753 < 0.780,**可调度** **优先级**:A (T=100) > B (T=150) > C (T=350) **调度结果**: ``` 0 20 60 160 180 220 240 300 320 360 460 | A1 | B1 | C1 | A2 | B2 | A3 | A4 | B3 | C2 | ``` > 注:实际 RMS 抢占版本在新 A 到达时若优先级更高就抢占。从 t=20~60 B 一直在跑(40 ms),C 必须在 B 完成后 t=60 开始。 --- ### 3.5 多处理机调度 **问题**:M 个进程(线程)→ N 个处理机。 **SMP(Symmetric Multi-Processors)**:对称多处理机,所有处理机**同构(homogeneous)**。 **目标**:负载均衡(Load-Sharing)。 **就绪队列组织方式**: - **分队列**:每个处理机一个就绪队列,**不易均衡**。 - **共享队列**:所有处理机共享一个就绪队列 Q;master/slave 分配。 - 每个处理机可自主访问 Q。 #### 3.5.1 自调度(Self Scheduling)/ 均衡调度 - 一个**全局就绪队列**,多处理机互斥访问。 - 任何处理机空闲时,自行从就绪队列取进程。 **优点**: - 不需要专门的处理机从事任务分派 - 任务分配均衡 **缺点**: - CPU 较多时,就绪队列成为**瓶颈** - 线程两次调度可能处于不同处理机(**不亲和**,cache 不命中) - 不能保证同组线程同时调度 **改进的自调度(Mach 系统)**: - **全局队列**:系统一个 - **局部队列**:每个 CPU 一个 - 调度时:**首先考虑局部队列**,然后考虑全局队列 #### 3.5.2 组调度(Gang Scheduling) - 将**一组相关(合作)的线程**同时分派到多个处理机上运行。 - 避免合作线程之间的相互等待。 - 降低开销,提高运行效率。 **例子**: - **Cm*** 多处理机系统 - **Task force**:一组相关的计算 --- ### 3.6 系统举例 #### 3.6.1 Linux 进程调度 **三类特征进程**: - **Real-time FIFO**:实时先到先服务 - **Real-time Round Robin**:实时时间片轮转 - **Timesharing**:分时 **Goodness-based scheduling(基于 goodness 的调度)**: - **priority**(优先级):0–40(缺省 20),可通过 `nice()` 系统调用调整 - `nice(value)` 中 value 取值范围 -20~+20 - `priority = 20 - value` - **counter**:进程尚可运行的**剩余时间** **counter 更新规则**: - 对运行进程:每个时钟间隔(10ms,称为 1 个 **jiffy**)counter 减 1 - 当所有就绪进程 counter 配额下降到 0 时,**重新计算所有进程**(包括等待进程)的 counter: - `counter = (counter / 2) + priority` **goodness 计算**: - 实时进程:`goodness = 1000 + priority` - 分时进程且 counter = 0:`goodness = 0` - 分时进程且 counter > 0:`goodness = counter + priority` **调度发生时刻**: 1. 运行进程的 counter 减至 0 2. 运行进程执行系统调用 `exit` 3. 运行进程因等待 I/O、信号灯而被封锁 4. 原来具有高 goodness 的进程被解除封锁 **调度效果**: - 实时优先于分时(实时 goodness 至少 1000) - 交互和 I/O 进程优先于 CPU 进程(等待时 counter 减半,I/O 后重新计算时反而较高) **Linux 对称多处理(SMP)**: - Linux 2.0 是支持 SMP 的第一个 Linux 核心 - 进程或线程可同时运行在多个处理机 - **核心自旋锁(spin-lock)**:保证任何时刻最多只有一个处理机执行核心代码 - 真正 SMP:把一个自旋锁分解为多个独立自旋锁,分别保护核心代码不相交子集 #### 3.6.2 Windows 10 线程调度 **主要特征**: - 线程级调度(Thread level scheduling) - 实时 + 前台 + 后台三类 - 实时:无 deadline 调度 - 前台:GUI 窗口 - 后台:非交互 - **可剥夺 + 动态优先级 + RR + 反馈** - SMP 支持 **优先级别(共 32 级)**: | 类别 | 范围 | 说明 | |---|---|---| | 实时优先级 | 16-31 | 16 个;应用程序需有权限才能提升为实时 | | 可变线程优先级 | 1-15 | 15 个;基本优先级 + 当前优先级 | | 系统线程 | 0 | 1 个 | **基本优先级 vs. 当前优先级**: - 线程基本优先级继承进程基本优先级,**可上下浮动 2** - 如进程基本优先级 4,线程基本优先级 2-6 - 当前优先级在 2-15 范围内变动 - 可动态提升(如运行完一个 quantum 后自动下降,不低于基本优先级) **优先级提升**(不会超过 15): - I/O 操作完成 - 事件等待结束 - 前台进程中的线程完成一个等待操作 - 窗口活动唤醒 GUI 线程 - 就绪超过一定时限未获得处理机 **抢占 CPU**: - 抢先情形:被唤醒线程优先级 > 运行线程;某线程优先级动态变化 - 被抢先线程回到相应就绪队列 - 时间配额:实时线程重新分配完整配额;其它线程保持剩余配额 **时间配额(Quantum)**: - 长度:6-36 - 时钟中断 15ms 一次,每次减 3 - 用完需要 2-12 次时钟中断(30-180 ms) - 配额用完后进入就绪队列,优先级下降 **SMP 线程调度**: - **处理器亲合掩码**:每个进程有一个,缺省为所有处理器集合 - 线程继承其进程的亲合掩码 - 可用 `SetProcessAffinityMask`、`SetThreadAffinityMask` 修改 **理想处理器(Ideal processor)**: - 首选处理器、第二处理器(在内核线程控制块中) - 线程创建时**随机**确定,分散各线程与处理机对应关系 - 线程可调 `SetThreadIdealProcessor` 修改 **就绪线程选择处理器**: - 有空闲处理器时:首选 → 第二 → 当前执行(执行调度代码的)→ 由高到低找空闲 - 无空闲处理器:考虑抢先;首选 → 第二 → 可运行编号最大 → 不能抢先就进入相应就绪队列 **处理器选择就绪线程**: - 空闲处理器调度顺序:线程上次在此 CPU 运行的 → 理想处理器是该 CPU 的 → 处于就绪状态时间 > 2 个 quantum 的 → 优先级别 ≥ 24 的 --- ## 二、考点总结 ### 考点 1:中断的概念与三要素 - **内容**:处理机在运行过程中出现某一事件,必须中止正在运行的程序,转去处理这个事件,处理完毕再返回原程序。中断系统 = 中断装置(硬件)+ 中断处理程序(软件)。 - **考查方式**:选择 / 填空 - **可能的题目**: 1. **选择题**:操作系统是 ___ 驱动的。 **答案**:中断(Interrupt) ### 考点 2:中断的分类(强迫性中断 vs. 自愿性中断) - **内容**:强迫性中断(时钟、I/O、控制台、硬件故障、程序性)vs. 自愿性中断(系统调用/访管指令)。 - **考查方式**:选择 / 填空 - **可能的题目**: 1. **选择题**:下列哪个属于自愿性中断? A. 时钟中断 B. 除 0 中断 C. `open()` 系统调用 D. 内存校验错 **答案:C** 2. **填空题**:访管指令属于 ___ 性中断。 **答案**:自愿 ### 考点 3:中断向量与中断向量表 - **内容**:中断向量 = (PSW, PC)。每类中断事件一个向量;存放位置由硬件规定;内容由 OS 初始化时填入;所指 PSW 应为系统态。 - **考查方式**:选择 / 填空 / 简答 - **可能的题目**: 1. **填空题**:中断向量由 ___ 和 ___ 组成。 **答案**:PSW, PC 2. **简答题**:中断向量表中各项内容的填充由谁完成? **答案**:由操作系统在系统初始化时设置好。 ### 考点 4:中断响应与处理过程 - **内容**:硬件自动保存 PSW、PC 到系统栈;根据中断向量装载新 PSW、PC;进入处理程序;处理完恢复。 - **考查方式**:简答 / 论述 - **可能的题目**: 1. **简答题**:简述中断响应过程。 **答案**:① CPU 收到中断请求;② 硬件自动保存当前 PSW、PC 到系统栈;③ 根据中断向量装载新 PSW、PC;④ 转入中断处理程序执行;⑤ 处理完毕后通过 iret 指令从系统栈恢复原 PSW、PC;⑥ 返回断点继续执行。 ### 考点 5:中断嵌套与系统栈 - **内容**:高优先级中断可嵌入低优先级中断;实现方法为屏蔽不高于当前优先级的中断源;使用系统栈保存嵌套现场。 - **考查方式**:选择 / 简答 - **可能的题目**: 1. **选择题**:实现中断嵌套的方法是? A. 提高 CPU 主频 B. 屏蔽不高于当前中断优先级的中断源 C. 使用更大的内存 D. 增加处理机数量 **答案:B** ### 考点 6:中断优先级与中断屏蔽 - **内容**:中断优先级由硬件规定,依据紧迫程度和处理时间;中断屏蔽可由程序调整响应次序。 - **考查方式**:选择 / 填空 ### 考点 7:各种中断的处理(I/O、时钟、控制台、硬件故障、程序性) - **内容**: - I/O 中断:正常结束唤醒等待进程;错误复执 3 次后报告。 - 时钟中断:housekeeping、进程管理、软时钟、进程切换。 - 控制台:一按钮一向量一处理程序。 - 硬件故障:电源故障保存/恢复现场;内存故障划出系统。 - 程序性:越界/非法 OS 处理;除 0/溢出可用户处理。 - **考查方式**:简答 ### 考点 8:用户自行处理中断的机制(中断续元表) - **内容**:调试语句 `on <中断条件> <中断续元入口>`;编译时生成中断续元表(初始全 0);运行时填写;中断时查表(0 → OS 处理;非 0 → 用户处理)。 - **考查方式**:简答 - **可能的题目**: 1. **简答题**:简述用户处理中断的实现机制。 **答案**:① 编译时生成中断续元表,初始为 0;② 用户在程序中用 `on <中断条件> goto LA` 等调试语句,运行时填写中断续元表;③ 发生中断时,OS 查表,若为 0 则按 OS 默认处理,若非 0 则保存现场到用户栈,跳转到用户的续元入口处理。 ### 考点 9:自愿性中断与系统调用 - **内容**:访管指令 SVC n 实现系统调用;参数准备 → SVC → 返回值。系统调用驱动表。 - **考查方式**:选择 / 填空 / 简答 - **可能的题目**: 1. **填空题**:实现系统调用需通过 ___ 指令。 **答案**:访管(SVC) ### 考点 10:处理机调度准则与性能指标 - **内容**:CPU 利用率、吞吐量、周转时间、响应时间、系统开销。 - 周转时间 = 完成时间 − 到达时间 - 带权周转时间 = 周转时间 / 运行时间 - **考查方式**:选择 / 填空 / 计算 - **可能的题目**: 1. **计算题**:已知 4 个作业 ...(见考点 11) 2. **填空题**:带权周转时间 = 周转时间 / ___。 **答案**:运行时间 ### 考点 11:FCFS 算法(计算题必考) - **内容**:按到达次序;非剥夺;护航效应。 - **考查方式**:计算 - **可能的题目**: 1. **计算题**:有 3 个作业,到达时间分别为 0、1、2,运行时间分别为 27、3、5。用 FCFS 算法求平均周转时间和平均带权周转时间。 **答案**: - 调度顺序:P1 → P2 → P3 - 周转时间:P1=27, P2=29, P3=33 - 平均周转 = (27+29+33)/3 = 29.67 - 带权周转:P1=1, P2=9.67, P3=6.6 - 平均带权周转 = (1+9.67+6.6)/3 ≈ 5.76 ### 考点 12:SJF 算法(计算题必考) - **内容**:按 CPU burst 长度;非剥夺;同时到达时平均等待时间最优;可能饿死长作业。 - **考查方式**:计算 - **可能的题目**: 1. **计算题**:4 个作业同时到达,运行时间分别为 12、5、7、3。用 SJF 求平均周转时间。 **答案**: - 调度顺序:P4(3) → P2(5) → P3(7) → P1(12) - 完成时间:3、8、15、27 - 周转时间:3、8、15、27 - 平均周转 = (3+8+15+27)/4 = 13.25 - 平均带权周转 = (1+1.6+2.14+2.25)/4 = 1.75 ### 考点 13:SRTN 算法(剥夺式 SJF) - **内容**:可剥夺 SJF;新进程到达若比当前剩余时间短则抢占。 - **考查方式**:计算 - **可能的题目**: 1. **计算题**:作业 P1(0,12)、P2(1,9)、P3(3,6)、P4(5,3) 用 SRTN 调度,求平均周转与平均等待时间。 **答案**: - 调度:P1(0-1) → P2(1-3) → P3(3-5) → P4(5-8) → P3(8-12) → P2(12-19) → P1(19-30) - 完成时间:30、19、12、8 - 周转:30、18、9、3 - 平均周转 = (30+18+9+3)/4 = 15 - 平均带权 = (2.5+2+1.5+1)/4 = 1.75 - 平均等待 = (18+9+3+0)/4 = 7.5 ### 考点 14:HRN(最高响应比优先)算法 - **内容**:RR = (BT+WT)/BT = 1 + WT/BT;非剥夺;FCFS 和 SJF 的折中;长作业不会饿死。 - **考查方式**:计算 / 简答 - **可能的题目**: 1. **简答题**:为什么 HRN 算法能避免长作业饿死? **答案**:响应比 RR = 1 + WT/BT,长作业随着等待时间 WT 增大,响应比也不断提高,最终会被调度。 ### 考点 15:最高优先数算法(HPF) - **内容**:静态优先数(批处理)vs. 动态优先数(实时);非剥夺 vs. 剥夺;UNIX 用 p_pri = min{127, USER + p_cpu/16 + p_nice}。 - **考查方式**:选择 / 简答 / 计算 - **可能的题目**: 1. **选择题**:UNIX 中运行进程 p_cpu 每 20ms ___ 1。 **答案:加** ### 考点 16:RR(时间片轮转)算法 - **内容**:时间片轮转;剥夺式;分时系统;时间片过长退化为 FCFS,过短开销大。 - **考查方式**:计算 / 选择 - **可能的题目**: 1. **计算题**:3 进程 P1(0,17)、P2(0,10)、P3(0,3) 用 RR 时间片 4ms 调度,求平均周转和平均等待。 **答案**: - 调度:P1(0-4) P2(4-8) P3(8-11) P1(11-15) P2(15-19) P1(19-23) P2(23-25) P1(25-29) P1(29-30) - 完成:P1=30, P2=25, P3=11 - 周转:30, 25, 11 - 平均周转 = (30+25+11)/3 = 22 - 平均带权 = (1.76+2.5+3.67)/3 ≈ 2.64 - 平均等待 = (13+15+8)/3 = 12 ### 考点 17:多级队列 MLQ vs. 反馈队列 FB - **内容**:MLQ 队列固定;FB 队列可变,新进程在高级队列,用完时间片降级。三大优点:资源利用率高、响应快、开销小。 - **考查方式**:选择 / 简答 - **可能的题目**: 1. **选择题**:在反馈排队算法中,新创建的进程应进入 ___ 队列。 **答案:最高级** ### 考点 18:调度时机 - **内容**:三种时机:进程结束、进程等待、处理机被剥夺。 - **考查方式**:填空 / 简答 ### 考点 19:调度过程 dispatcher - **内容**:保存下降进程现场(寄存器 → PCB)→ 选择上升进程 → 恢复现场(PCB → 寄存器,先恢复通用寄存器,最后恢复 PSW, PC;**PSW 和 PC 必须用一条指令同时恢复**)。 - **考查方式**:简答 - **可能的题目**: 1. **简答题**:为什么由核心返回目态程序时进程的 PSW 和 PC 必须用一条指令同时恢复? **答案**:恢复 PC 后 CPU 立即按 PC 取指执行,若 PSW 还未恢复,处理机仍处于管态,会破坏系统安全。用一条指令同时恢复 PSW 和 PC,可保证"管态 → 目态"与"PC 指向用户程序"原子完成,避免出现"PC 已指向用户程序但 PSW 还是管态"的不安全中间状态。 2. **简答题**:进程切换时需要保存哪些现场信息? **答案**:包括 PSW(程序状态字)、PC(程序计数器)、SP(栈指针)、通用寄存器、地址寄存器(基址/限长/页表指针等)以及其它与该进程相关的硬件状态。 ### 考点 20:三级调度(高级/中级/低级) - **内容**:高级调度(作业调度)、中级调度(交换调度,控制并发度)、低级调度(处理机调度)。 - **考查方式**:选择 / 填空 / 简答 - **可能的题目**: 1. **填空题**:处理机调度又称为 ___ 级调度。 **答案:低** ### 考点 21:作业状态及转换 - **内容**:提交 → 后备 → 执行 → 完成 → 退出。SPOOLing 输入/输出;作业调度(1)(2)。 - **考查方式**:填空 / 简答 - **可能的题目**: 1. **填空题**:把作业从"后备"状态变为"执行"状态的是 ___ 调度。 **答案:作业(高级)** ### 考点 22:适合批作业调度 vs. 不适合批作业调度 - **内容**:适合 FCFS、HPF、SJF、HRN;不适合 RR、SRTN、FB。 - **考查方式**:选择 - **可能的题目**: 1. **选择题**:下列哪个算法不适合作为作业调度算法? A. FCFS B. SJF C. RR D. HRN **答案:C** ### 考点 23:实时任务分类 - **内容**:硬实时 vs. 软实时;周期性 vs. 随机性。 - **考查方式**:选择 / 填空 ### 考点 24:实时调度可调度的必要条件 - **内容**:$\sum C_i/T_i \leq 1$。 - **考查方式**:计算 / 简答 - **可能的题目**: 1. **判断题**:3 个周期性任务 T1=100,T2=200,T3=500,C1=50,C2=30,C3=100,是否满足可调度的必要条件? **答案**:C1/T1+C2/T2+C3/T3 = 0.5+0.15+0.2 = 0.85 < 1,满足必要条件(但不保证一定可调度)。 ### 考点 25:EDF 最早截止期优先 - **内容**:动态优先级;优先选截止期最早的;可抢先;最优调度。 - **考查方式**:计算 - **可能的题目**: 1. **计算题**:见考点 26 后附例题。 ### 考点 26:RMS 速率单调调度 - **内容**:周期越短优先级越高;可调度上限 $m(2^{1/m}-1)$,m→∞ 时为 ln2≈0.693。 - **考查方式**:计算 / 简答 - **可能的题目**: 1. **计算题**:3 个周期性任务 T(A)=100,T(B)=150,T(C)=350;C(A)=20,C(B)=40,C(C)=100。判断 RMS 是否可调度,若是画出 Gantt 图。 **答案**: - C_i/T_i 总和 = 0.2 + 0.267 + 0.286 ≈ 0.753 - m=3 上限 = 3×(2^{1/3}-1) ≈ 0.780 - 0.753 < 0.780,**可调度** - 优先级:A > B > C - Gantt:A1(0-20) B1(20-60) C1(60-160) A2(160-180) B2(180-220) A3(220-240) A4(280-300) B3(300-320) C2(320-360+) ### 考点 27:RMS vs. EDF - **内容**:RMS 静态优先级,条件严,实现简单;EDF 动态优先级,条件松,最优调度。 - **考查方式**:简答 ### 考点 28:多处理机调度(自调度 / 组调度) - **内容**:自调度:共享就绪队列,瓶颈、不亲和;改进:Mach 全局+局部队列;组调度:一组相关线程同时调度(避免相互等待)。 - **考查方式**:选择 / 简答 - **可能的题目**: 1. **简答题**:自调度的优缺点? **答案**:优点是不需要专门处理机分派任务、负载均衡;缺点是就绪队列成为瓶颈、线程两次调度可能不在同一处理机(cache 不命中)、不能保证同组线程同时调度。 ### 考点 29:Linux 调度(goodness / counter) - **内容**:三类进程(Real-time FIFO、Real-time RR、Timesharing);goodness-based;counter 每 10ms 减 1;用完重新计算 counter = counter/2 + priority;实时 goodness = 1000+priority。 - **考查方式**:选择 / 填空 / 简答 - **可能的题目**: 1. **填空题**:Linux 中分时进程的 goodness = counter + ___。 **答案:priority** ### 考点 30:Windows 10 线程调度 - **内容**:32 个优先级(实时 16-31、可变 1-15、系统 0);基本优先级继承进程可上下浮动 2;动态提升;时间配额 6-36,时钟 15ms 减 3;SMP 理想处理器/亲合掩码。 - **考查方式**:选择 / 填空 ### 考点 31:综合计算题(必考大题) - **考查方式**:计算 - **可能的题目**: 1. **计算题**:有 5 个作业,到达时间和运行时间分别为:J1(0,4)、J2(1,3)、J3(2,2)、J4(3,5)、J5(4,1)。分别用 FCFS、SJF(剥夺式 SRTN)、非剥夺 SJF、HRN(默认非剥夺)调度,并计算平均周转时间。 **解答**: - **FCFS**:J1→J2→J3→J4→J5 - 完成:4, 7, 9, 14, 15 - 周转:4, 6, 7, 11, 11 - 平均周转 = (4+6+7+11+11)/5 = **7.8** - **非剥夺 SJF**:J1(0-4), J3(4-6), J5(6-7), J2(7-10), J4(10-15) - 完成:4, 10, 6, 15, 7 - 周转:4, 9, 4, 12, 3 - 平均周转 = (4+9+4+12+3)/5 = **6.4** - **SRTN**: - t=0 J1 到达, 跑 - t=1 J2(3) 到达, J1 剩 3, 不抢 - t=2 J3(2) 到达, J1 剩 2, 不抢 - t=3 J4(5) 到达, J1 剩 1, 不抢 - t=4 J1 完。剩余:J2(剩2,到1), J3(2,到2), J4(5,到3), J5(1,到4) - t=4 选 J5(1) - t=5 J5 完。剩余:J2(2,到1), J3(2,到2), J4(5,到3) - t=5 选 J2/J3 同为 2,按 J2 先 - t=7 J2 完。选 J3 - t=9 J3 完。选 J4 - t=14 J4 完 - 完成:J1=4, J2=7, J3=9, J4=14, J5=5 - 周转:4, 6, 7, 11, 1 - 平均周转 = (4+6+7+11+1)/5 = **5.8** - **HRN(默认非剥夺)**: - 每次调度时计算所有未完成作业的响应比 RR = 1 + WT/BT - t=0:仅 J1,J1 跑。t=4 J1 完。 - t=4 重新计算: - J2: 1+3/3=2; J3: 1+2/2=2; J4: 1+1/5=1.2; J5: 1+0/1=1 - 选 J2/J3(同为 2),按到达 J2 先 - t=7 J2 完。 - t=7 计算:J3: 1+5/2=3.5; J4: 1+4/5=1.8; J5: 1+3/1=4 → 选 J5 - t=8 J5 完。计算:J3: 1+6/2=4; J4: 1+5/5=2 → 选 J3 - t=10 J3 完。J4: 跑 - t=15 J4 完 - 完成:J1=4, J2=7, J3=10, J4=15, J5=8 - 周转:4, 6, 8, 12, 4 - 平均周转 = (4+6+8+12+4)/5 = **6.8** ### 考点 32:可调度的必要条件 vs. 充分条件 - **内容**:$\sum C_i/T_i \leq 1$ 是必要条件;RMS 的 $m(2^{1/m}-1)$ 是充分条件。 - **考查方式**:选择 / 简答 - **可能的题目**: 1. **判断题**:若 $\sum C_i/T_i > 1$,则周期性实时任务一定不可调度。 **答案:正确**(因为必要条件不满足) ### 考点 33:进程状态转换与中断的关联 - **内容**:运行 → 等待(程序主动 wait);等待 → 就绪(事件发生后中断唤醒);就绪 → 运行(调度);运行 → 就绪(时间片到/剥夺);创建、终止、挂起等。 - **考查方式**:画图 / 选择 - **可能的题目**: 1. **画图题**:画出包含挂起状态的就绪、运行、等待状态转换图。 **答案要点**:在原有 5 态图基础上增加就绪挂起、等待挂起两态;挂起操作由中级调度决定;激活由中级调度从外存换入。 ### 考点 34:CPU burst 长度预测 - **内容**:$\tau_{n+1} = \alpha t_n + (1-\alpha)\tau_n$;$\alpha$ 越大越看重最近历史,通常取 0.5。 - **考查方式**:计算 / 简答 - **可能的题目**: 1. **计算题**:已知实际 CPU burst 长度依次为 5、3、7、9,$\alpha=0.5$,$\tau_0=5$。求 $\tau_1, \tau_2, \tau_3, \tau_4$。 **答案**: - $\tau_1 = 0.5 \times 5 + 0.5 \times 5 = 5$ - $\tau_2 = 0.5 \times 3 + 0.5 \times 5 = 4$ - $\tau_3 = 0.5 \times 7 + 0.5 \times 4 = 5.5$ - $\tau_4 = 0.5 \times 9 + 0.5 \times 5.5 = 7.25$