postgraduate-prep/experiment/code/sjf.py

104 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""
短作业优先调度算法 (SJF)
Shortest Job First / Shortest Remaining Time First (SRTF)
"""
from typing import List, Dict
from base import (
Process,
ProcessScheduler,
generate_random_processes,
print_processes
)
class SJFScheduler(ProcessScheduler):
"""短作业优先调度 (Shortest Job First)"""
def __init__(self, processes: List[Process], preemptive: bool = False):
super().__init__(processes)
self.preemptive = preemptive
def schedule(self) -> Dict:
"""SJF 调度算法"""
if self.preemptive:
return self.schedule_preemptive()
return self.schedule_non_preemptive()
def schedule_non_preemptive(self) -> Dict:
"""非抢占式 SJF"""
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: p.burst_time)
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("SJF (短作业优先 - 非抢占)")
def schedule_preemptive(self) -> Dict:
"""抢占式 SJF (SRTF)"""
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: p.remaining_time)
p = ready_queue[0]
if p.start_time == -1:
p.start_time = current_time
p.remaining_time -= 1
current_time += 1
if p.remaining_time == 0:
self.calculate_metrics(p, current_time)
self.results.append(p)
ready_queue.remove(p)
completed += 1
else:
current_time += 1
return self.print_results("SRTF (最短剩余时间优先 - 抢占)")
if __name__ == "__main__":
processes = generate_random_processes(n=5, seed=42)
print_processes(processes, "测试数据")
print("\n" + "="*60)
print("非抢占式 SJF")
print("="*60)
scheduler1 = SJFScheduler(processes, preemptive=False)
scheduler1.schedule()
print("\n" + "="*60)
print("抢占式 SJF (SRTF)")
print("="*60)
scheduler2 = SJFScheduler(processes, preemptive=True)
scheduler2.schedule()