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. 理解进程调度的基本概念和原理 1. 理解进程调度的基本概念和原理
2. 掌握 FCFS、SJF、RR、优先级调度、MLFQ 等算法 2. 掌握 FCFS、SJF、RR、优先级调度、HRRN、MLFQ 等算法
3. 通过模拟实验比较各算法的性能指标 3. 通过模拟实验比较各算法的性能指标
## 实验环境 ## 实验环境
@ -22,6 +22,7 @@ experiment/
├── sjf.py # 短作业优先调度 (含 SRTF) ├── sjf.py # 短作业优先调度 (含 SRTF)
├── rr.py # 时间片轮转调度 ├── rr.py # 时间片轮转调度
├── priority.py # 优先级调度 ├── priority.py # 优先级调度
├── hrrn.py # 高响应比优先调度
└── mlfq.py # 多级反馈队列调度 └── mlfq.py # 多级反馈队列调度
``` ```
@ -102,6 +103,28 @@ $$
\text{吞吐量} = \frac{n}{T_{\text{总}}} \quad \text{其中 } T_{\text{总}} = CT_{\text{max}} - AT_{\text{min}} \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 ```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 rr import RoundRobinScheduler
from priority import PriorityScheduler from priority import PriorityScheduler
from mlfq import MLFQScheduler from mlfq import MLFQScheduler
from hrrn import HRRNScheduler
# 预设演示数据 # 预设演示数据
@ -50,6 +51,7 @@ def get_algorithm_config() -> Dict:
'Priority': lambda p: PriorityScheduler(p, preemptive=False), 'Priority': lambda p: PriorityScheduler(p, preemptive=False),
'RR': lambda p: RoundRobinScheduler(p, time_slice=4), 'RR': lambda p: RoundRobinScheduler(p, time_slice=4),
'MLFQ': lambda p: MLFQScheduler(p), 'MLFQ': lambda p: MLFQScheduler(p),
'HRRN': HRRNScheduler,
} }