Загрузка данных
import copy
class Process:
def __init__(self, pid, arrival_time, burst_time):
self.pid = pid
self.arrival_time = arrival_time
self.burst_time = burst_time
self.remaining_time = burst_time # для RR
self.start_time = None
self.completion_time = None
self.waiting_time = None
self.turnaround_time = None
def fcfs_scheduling(processes):
"""Алгоритм FCFS (First Come, First Served)"""
procs = sorted(processes, key=lambda p: p.arrival_time)
current_time = 0
for p in procs:
if current_time < p.arrival_time:
current_time = p.arrival_time
p.start_time = current_time
p.completion_time = current_time + p.burst_time
p.turnaround_time = p.completion_time - p.arrival_time
p.waiting_time = p.turnaround_time - p.burst_time
current_time = p.completion_time
return procs
def round_robin_scheduling(processes, time_quantum):
"""Алгоритм Round Robin"""
procs = copy.deepcopy(processes)
for p in procs:
p.remaining_time = p.burst_time
p.start_time = None
p.completion_time = None
queue = []
current_time = 0
idx = 0
n = len(procs)
completed = 0
# сортируем по времени прибытия для начального заполнения
procs_sorted = sorted(procs, key=lambda p: p.arrival_time)
while completed < n:
# добавляем все процессы, которые прибыли к текущему времени
while idx < n and procs_sorted[idx].arrival_time <= current_time:
queue.append(procs_sorted[idx])
idx += 1
if not queue:
# нет процессов — перематываем время до следующего прибытия
current_time = procs_sorted[idx].arrival_time
continue
p = queue.pop(0) # берём первый из очереди
if p.start_time is None:
p.start_time = current_time
# выполняем процесс
exec_time = min(time_quantum, p.remaining_time)
p.remaining_time -= exec_time
current_time += exec_time
# добавляем новые процессы, прибывшие во время выполнения
while idx < n and procs_sorted[idx].arrival_time <= current_time:
queue.append(procs_sorted[idx])
idx += 1
if p.remaining_time == 0:
# процесс завершён
p.completion_time = current_time
p.turnaround_time = p.completion_time - p.arrival_time
p.waiting_time = p.turnaround_time - p.burst_time
completed += 1
else:
# процесс ещё не завершён — в конец очереди
queue.append(p)
return procs
def print_results(procs, algo_name):
"""Вывод результатов"""
print(f"\n{'='*50}")
print(f"Результаты: {algo_name}")
print(f"{'='*50}")
print(f"{'PID':<5} {'Arrival':<8} {'Burst':<8} {'Start':<8} {'Completion':<10} {'Waiting':<8} {'Turnaround':<8}")
print("-" * 65)
total_waiting = 0
total_turnaround = 0
for p in procs:
print(f"{p.pid:<5} {p.arrival_time:<8} {p.burst_time:<8} {p.start_time:<8} {p.completion_time:<10} {p.waiting_time:<8} {p.turnaround_time:<8}")
total_waiting += p.waiting_time
total_turnaround += p.turnaround_time
n = len(procs)
avg_waiting = total_waiting / n
avg_turnaround = total_turnaround / n
print("-" * 65)
print(f"Среднее время ожидания: {avg_waiting:.2f}")
print(f"Среднее время выполнения (turnaround): {avg_turnaround:.2f}")
# Пример использования
if __name__ == "__main__":
# Создаём процессы: PID, время прибытия, время CPU burst
processes = [
Process(1, 0, 5),
Process(2, 1, 3),
Process(3, 2, 2),
Process(4, 3, 4)
]
# FCFS
fcfs_result = fcfs_scheduling(copy.deepcopy(processes))
print_results(fcfs_result, "FCFS")
# Round Robin с квантом = 2
rr_result = round_robin_scheduling(copy.deepcopy(processes), time_quantum=2)
print_results(rr_result, f"Round Robin (квант = 2)")