postgraduate-prep/experiment/README.md

189 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 进程调度算法实验
## 实验目的
1. 理解进程调度的基本概念和原理
2. 掌握 FCFS、SJF、RR、优先级调度、HRRN、MLFQ 等算法
3. 通过模拟实验比较各算法的性能指标
## 实验环境
- Python 3.x
## 文件结构
```
experiment/
├── README.md # 实验文档
└── code/ # 代码目录
├── base.py # 基础类Process, ProcessScheduler
├── main.py # 主程序入口
├── fcfs.py # 先来先服务调度
├── sjf.py # 短作业优先调度 (含 SRTF)
├── rr.py # 时间片轮转调度
├── priority.py # 优先级调度
├── hrrn.py # 高响应比优先调度
└── mlfq.py # 多级反馈队列调度
```
## 性能指标
设进程 $P_i$ 的到达时间为 $AT_i$,完成时间为 $CT_i$,服务时间为 $BT_i$,首次运行时间为 $ST_i$
### 周转时间 (Turnaround Time)
$$
TAT_i = CT_i - AT_i
$$
**定义**:进程从提交到完成的总时间
**含义**:衡量进程在系统中停留的总时长,包括等待时间和实际运行时间
### 带权周转时间 (Weighted Turnaround Time)
$$
WTAT_i = \frac{TAT_i}{BT_i}
$$
**定义**:周转时间与服务时间的比值
**含义**:衡量进程的相对延迟,比值越大说明等待时间相对于服务时间越长
- $WTAT_i = 1$:理想情况,无额外等待
- $WTAT_i > 1$:存在等待时间
- $WTAT_i$ 越小越好
### 等待时间 (Waiting Time)
$$
WT_i = TAT_i - BT_i = (CT_i - AT_i) - BT_i
$$
**定义**:进程在就绪队列中等待的时间总和
**含义**:不包含实际运行时间,只计算等待 CPU 的时间
### 响应时间 (Response Time)
$$
RT_i = ST_i - AT_i
$$
**定义**:从提交到首次运行的时间
**含义**:用户感受到的"启动延迟",对于交互系统尤为重要
### 性能指标总结
| 指标 | 公式 | 优化目标 | 适用场景 |
|------|------|----------|----------|
| 周转时间 | $CT - AT$ | 越小越好 | 批处理系统 |
| 带权周转时间 | $(CT-AT)/BT$ | 越小越好 | 公平性评估 |
| 等待时间 | $TAT - BT$ | 越小越好 | 调度算法比较 |
| 响应时间 | $ST - AT$ | 越小越好 | 交互系统 |
## 算法公式
### FCFS 周转时间
$$
TAT_i = \sum_{j=1}^{i} BT_j - AT_i \quad (AT_i \leq AT_{i+1})
$$
### SJF 平均等待时间最小化
$$
\min \frac{1}{n} \sum_{i=1}^{n} WT_i
$$
### RR 吞吐量
$$
\text{吞吐量} = \frac{n}{T_{\text{总}}} \quad \text{其中 } T_{\text{总}} = CT_{\text{max}} - AT_{\text{min}}
$$
### HRRN 响应比
$$
R = \frac{\text{等待时间} + \text{服务时间}}{\text{服务时间}} = 1 + \frac{WT}{BT}
$$
**特点**
- 非抢占式
- 综合考虑等待时间和服务时间
- 避免长作业饥饿(等待时间越长,响应比越高)
## 算法对比
| 算法 | 类型 | 优点 | 缺点 |
|------|------|------|------|
| FCFS | 非抢占 | 简单、公平 | 平均等待时间长 |
| SJF | 非抢占/抢占 | 平均等待时间最优 | 长作业饥饿 |
| HRRN | 非抢占 | 避免长作业饥饿 | 开销较大 |
| RR | 抢占 | 响应时间短、公平 | 开销较大 |
| 优先级 | 抢占/非抢占 | 可控性强 | 低优先级饥饿 |
| MLFQ | 抢占 | 综合性能好 | 实现复杂 |
## 运行方式
```bash
cd code
# 使用演示数据5个进程
python main.py --demo
# 生成随机测试数据默认5个进程种子42
python main.py
# 生成100个随机进程
python main.py -n 100
# 固定种子生成1000个进程可复现
python main.py -n 1000 -s 42
# 自定义参数范围
python main.py -n 50 --arrival 0,100 --burst 5,50 --priority 1,5
# 运行指定算法
python main.py -n 20 -a FCFS,SJF,RR
# 每次运行使用不同随机数据
python main.py -n 20 -s -1
```
### 命令行参数说明
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `-n, --num` | 进程数量 | 5 |
| `-s, --seed` | 随机种子 | 42固定 |
| `-a, --algo` | 运行的算法 | 全部 |
| `--demo` | 使用预设演示数据 | False |
| `--arrival` | 到达时间范围 | 0,50 |
| `--burst` | 服务时间范围 | 1,20 |
| `--priority` | 优先级范围 | 1,10 |
### 预设演示数据
| PID | 到达时间 | 服务时间 | 优先级 |
|-----|----------|----------|--------|
| P1 | 0 | 7 | 3 |
| P2 | 2 | 4 | 1 |
| P3 | 4 | 1 | 4 |
| P4 | 5 | 4 | 2 |
| P5 | 6 | 2 | 3 |
## 思考题
1. 分析 FCFS 和 SJF 各自的优缺点
2. 为什么说 SJF 可以获得最短的平均等待时间?
3. RR 算法中,时间片大小对系统性能有何影响?
4. 多级反馈队列如何解决"长作业饥饿"问题?
5. 如何证明某种调度算法是最优的?
## 参考资料
- 操作系统概念Abraham Silberschatz
- 现代操作系统Andrew S. Tanenbaum