1297 lines
54 KiB
Markdown
1297 lines
54 KiB
Markdown
# 第三章 中断与处理机调度
|
||
|
||
> 本章是操作系统的核心章节。**操作系统是中断驱动的(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 <divide_zero> 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$
|