-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgorithms.py
More file actions
126 lines (121 loc) · 4.18 KB
/
Copy pathalgorithms.py
File metadata and controls
126 lines (121 loc) · 4.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from copy import deepcopy
from collections import deque
from typing import List, Tuple
from process import Process
GanttSegment = Tuple[int,int,str]
def simulate_fcfs(processes: List[Process]) -> Tuple[List[GanttSegment], List[Process]]:
procs = deepcopy(processes)
procs.sort(key=lambda p: (p.arrival, p.original_index))
clock = 0
gantt = []
for p in procs:
if clock < p.arrival:
gantt.append((clock, p.arrival, 'idle'))
clock = p.arrival
p.start_time = clock
clock += p.burst
p.finish_time = clock
p.remaining = 0
gantt.append((p.start_time, p.finish_time, p.pid))
return gantt, procs
def simulate_sjf(processes: List[Process]) -> Tuple[List[GanttSegment], List[Process]]:
procs_all = deepcopy(processes)
procs_all.sort(key=lambda p: (p.arrival, p.original_index))
ready = []
clock = 0
idx = 0
n = len(procs_all)
gantt = []
while True:
while idx < n and procs_all[idx].arrival <= clock:
ready.append(procs_all[idx])
idx += 1
if not ready:
if idx < n:
next_arr = procs_all[idx].arrival
if clock < next_arr:
gantt.append((clock, next_arr, 'idle'))
clock = next_arr
continue
else:
break
ready.sort(key=lambda p: (p.burst, p.arrival, p.original_index))
p = ready.pop(0)
p.start_time = clock
clock += p.burst
p.finish_time = clock
p.remaining = 0
gantt.append((p.start_time, p.finish_time, p.pid))
return gantt, procs_all
def simulate_priority(processes: List[Process]) -> Tuple[List[GanttSegment], List[Process]]:
procs_all = deepcopy(processes)
procs_all.sort(key=lambda p: (p.arrival, p.original_index))
ready = []
clock = 0
idx = 0
n = len(procs_all)
gantt = []
while True:
while idx < n and procs_all[idx].arrival <= clock:
ready.append(procs_all[idx])
idx += 1
if not ready:
if idx < n:
next_arr = procs_all[idx].arrival
if clock < next_arr:
gantt.append((clock, next_arr, 'idle'))
clock = next_arr
continue
else:
break
ready.sort(key=lambda p: (p.priority, p.arrival, p.original_index))
p = ready.pop(0)
p.start_time = clock
clock += p.burst
p.finish_time = clock
p.remaining = 0
gantt.append((p.start_time, p.finish_time, p.pid))
return gantt, procs_all
def simulate_rr(processes: List[Process], quantum: int) -> Tuple[List[GanttSegment], List[Process]]:
procs_all = deepcopy(processes)
procs_all.sort(key=lambda p: (p.arrival, p.original_index))
ready = deque()
clock = 0
idx = 0
n = len(procs_all)
gantt = []
# if nothing at t=0 jump to first arrival
if idx < n and procs_all[idx].arrival > 0:
gantt.append((0, procs_all[idx].arrival, 'idle'))
clock = procs_all[idx].arrival
while True:
while idx < n and procs_all[idx].arrival <= clock:
ready.append(procs_all[idx])
idx += 1
if not ready:
if idx < n:
next_arr = procs_all[idx].arrival
if clock < next_arr:
gantt.append((clock, next_arr, 'idle'))
clock = next_arr
continue
else:
break
p = ready.popleft()
if p.start_time is None:
p.start_time = clock
run_for = min(quantum, p.remaining)
start = clock
clock += run_for
p.remaining -= run_for
end = clock
gantt.append((start, end, p.pid))
# adding newly arrived during execution
while idx < n and procs_all[idx].arrival <= clock:
ready.append(procs_all[idx])
idx += 1
if p.remaining > 0:
ready.append(p)
else:
p.finish_time = clock
return gantt, procs_all