postgraduate-prep/experiment/code/hrrn.py

73 lines
2.2 KiB
Python

#!/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()