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