postgraduate-prep/experiment/code/mlfq.py

99 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""
多级反馈队列调度算法 (MLFQ)
Multilevel Feedback Queue
"""
from collections import deque
from typing import List, Dict
from base import (
Process,
ProcessScheduler,
generate_random_processes,
print_processes
)
class MLFQScheduler(ProcessScheduler):
"""多级反馈队列调度 (Multilevel Feedback Queue)"""
def __init__(self, processes: List[Process], queues: List[int] = None):
super().__init__(processes)
# 每层队列的时间片大小
self.queues = queues or [4, 8, 16]
self.aging_time = 50
def schedule(self) -> Dict:
"""MLFQ 调度算法"""
processes = sorted(self.processes, key=lambda p: p.arrival_time)
queues = [deque() for _ in self.queues]
current_time = 0
completed = 0
index = 0
while completed < len(processes):
while index < len(processes) and processes[index].arrival_time <= current_time:
queues[0].append(processes[index])
index += 1
# 老化
for i in range(1, len(queues)):
for p in list(queues[i]):
wait_time = current_time - p.arrival_time - (p.burst_time - p.remaining_time)
if wait_time > self.aging_time:
queues[i].remove(p)
queues[max(0, i-1)].append(p)
queue_idx = -1
for i in range(len(queues)):
if queues[i]:
queue_idx = i
break
if queue_idx >= 0:
p = queues[queue_idx].popleft()
if p.start_time == -1:
p.start_time = current_time
exec_time = min(self.queues[queue_idx], p.remaining_time)
p.remaining_time -= exec_time
current_time += exec_time
while index < len(processes) and processes[index].arrival_time <= current_time:
queues[0].append(processes[index])
index += 1
if p.remaining_time > 0:
if queue_idx < len(queues) - 1:
queues[queue_idx + 1].append(p)
else:
queues[queue_idx].append(p)
else:
self.calculate_metrics(p, current_time)
self.results.append(p)
completed += 1
else:
current_time += 1
return self.print_results(f"MLFQ (多级反馈队列, 队列时间片={self.queues})")
if __name__ == "__main__":
processes = generate_random_processes(n=5, seed=42)
print_processes(processes, "测试数据")
print("\n" + "="*60)
print("多级反馈队列调度 (默认配置)")
print("="*60)
scheduler1 = MLFQScheduler(processes)
scheduler1.schedule()
print("\n" + "="*60)
print("多级反馈队列调度 (自定义配置 [2, 5, 10])")
print("="*60)
scheduler2 = MLFQScheduler(processes, queues=[2, 5, 10])
scheduler2.schedule()