99 lines
3.2 KiB
Python
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()
|