feat: 增加高响应比优先算法

This commit is contained in:
ViperEkura 2026-04-26 17:39:10 +08:00
parent eb1de7b3d1
commit 1556f62047
3 changed files with 98 additions and 1 deletions

View File

@ -3,7 +3,7 @@
## 实验目的
1. 理解进程调度的基本概念和原理
2. 掌握 FCFS、SJF、RR、优先级调度、MLFQ 等算法
2. 掌握 FCFS、SJF、RR、优先级调度、HRRN、MLFQ 等算法
3. 通过模拟实验比较各算法的性能指标
## 实验环境
@ -22,6 +22,7 @@ experiment/
├── sjf.py # 短作业优先调度 (含 SRTF)
├── rr.py # 时间片轮转调度
├── priority.py # 优先级调度
├── hrrn.py # 高响应比优先调度
└── mlfq.py # 多级反馈队列调度
```
@ -102,6 +103,28 @@ $$
\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

72
experiment/code/hrrn.py Normal file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env python3
"""
高响应比优先调度算法 (HRRN)
Highest Response Ratio Next
"""
from typing import List, Dict
from base import (
Process,
ProcessScheduler,
generate_random_processes,
print_processes
)
class HRRNScheduler(ProcessScheduler):
"""
高响应比优先调度 (Highest Response Ratio Next)
响应比 = (等待时间 + 服务时间) / 服务时间
= 1 + 等待时间 / 服务时间
特点
- 非抢占式
- 综合考虑了等待时间和服务时间
- 避免长作业饥饿问题
"""
def calculate_response_ratio(self, p: Process, current_time: int) -> float:
"""计算响应比"""
waiting_time = current_time - p.arrival_time
return 1 + (waiting_time / p.burst_time) if p.burst_time > 0 else float('inf')
def schedule(self) -> Dict:
"""HRRN 调度算法"""
processes = sorted(self.processes, key=lambda p: p.arrival_time)
ready_queue: List[Process] = []
current_time = 0
completed = 0
while completed < len(processes):
# 添加所有到达的进程
for p in processes:
if p.arrival_time <= current_time and p not in ready_queue and p not in self.results:
ready_queue.append(p)
if ready_queue:
# 计算每个进程的响应比,选择最高的
ready_queue.sort(
key=lambda p: self.calculate_response_ratio(p, current_time),
reverse=True # 响应比高优先
)
p = ready_queue.pop(0)
p.start_time = current_time
current_time += p.burst_time
self.calculate_metrics(p, current_time)
self.results.append(p)
completed += 1
else:
current_time += 1
return self.print_results("HRRN (高响应比优先)")
if __name__ == "__main__":
processes = generate_random_processes(n=5, seed=42)
print_processes(processes, "测试数据")
scheduler = HRRNScheduler(processes)
scheduler.schedule()

View File

@ -29,6 +29,7 @@ from sjf import SJFScheduler
from rr import RoundRobinScheduler
from priority import PriorityScheduler
from mlfq import MLFQScheduler
from hrrn import HRRNScheduler
# 预设演示数据
@ -50,6 +51,7 @@ def get_algorithm_config() -> Dict:
'Priority': lambda p: PriorityScheduler(p, preemptive=False),
'RR': lambda p: RoundRobinScheduler(p, time_slice=4),
'MLFQ': lambda p: MLFQScheduler(p),
'HRRN': HRRNScheduler,
}