73 lines
2.2 KiB
Python
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()
|