# 第 7 章实验:命令行调度模拟器 sched.c 仿照 OSTEP 作业中的 `scheduler.py`,用 C 写的单 CPU 调度模拟器。支持 FIFO、SJF、RR 三种策略, 沿用原书 7.1 节的假设:所有作业在 0 时刻到达(按列表顺序先后排队)、只用 CPU、长度已知。 ## 编译与运行 ```sh make ./sched -p FIFO -l 100,200,300 # 打印逐步轨迹 + 统计 ./sched -p SJF -l 300,200,100 # 长作业排在前面:看 SJF 如何重排 ./sched -p RR -q 1 -l 100,200,300 -s # -s 只打印统计(RR q=1 的轨迹有 600 行) ``` 参数: - `-p` 策略:`FIFO`、`SJF`、`RR` - `-q` RR 的时间片(默认 1) - `-l` 逗号分隔的作业长度列表 - `-s` 只打印最终统计 ## 该观察到什么 | 命令 | 平均响应 | 平均周转 | |---|---|---| | `-p FIFO -l 200,200,200` | 200 | 400 | | `-p FIFO -l 100,200,300` | 133.33 | 333.33 | | `-p RR -q 1 -l 100,200,300` | 1.00 | 465.67 | | `-p FIFO -l 300,200,100` | 266.67 | 466.67 | | `-p SJF -l 300,200,100` | 133.33 | 333.33 | 为什么: 1. RR 把 CPU 在作业之间快速轮转,所以每个作业很快就第一次上 CPU(响应时间极好), 但所有作业都被"拉长",几乎同时在最后结束(周转时间很差)——这就是本章的核心权衡。 2. 长作业排在最前时,FIFO 出现护航效应;SJF 把最短的先跑,平均周转时间明显下降。 3. 这是确定性的模拟,输出在任何机器上都应该完全相同。可以和网页上的模拟器对照验证。