-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoperating_sys.py
More file actions
68 lines (58 loc) · 2.42 KB
/
operating_sys.py
File metadata and controls
68 lines (58 loc) · 2.42 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
class OperatingSystem:
def __init__(self, quantum_time, context_time):
self.quantum_time = quantum_time
self.context_time = context_time
def execute(self, jobs, scheduler):
current_time = 0
while True:
response = scheduler.update(current_time)
current_time += self.quantum_time
if response == 2:
break
elif response == 1:
current_time += self.context_time
return scheduler.jobs
class Job:
# self.state = 0: ready, 1: running, 2: blocked, 3: completed, 4: unarrived
def __init__(self, arrival_time, completion_time, interruptions):
self.arrival_time = arrival_time
self.completion_time = completion_time
self.interruptions = interruptions
self.state = 4
self.run_time = 0
self.first_run_time = -1
def set_state(self, state, time):
self.state = state
if state == 1:
if self.first_run_time == -1:
self.first_run_time = time
self.start_run_time = time
if state == 2:
self.start_block_time = time
if state == 3:
self.finish_time = time
def update(self, time):
if self.state == 4 and self.arrival_time <= time:
self.state = 0
elif self.state == 1:
delta_time = time - self.start_run_time
inter = self._get_interruption(self.run_time + 1, delta_time + self.run_time)
if inter is None:
if self.run_time + delta_time >= self.completion_time:
self.set_state(3, self.start_run_time + self.completion_time - self.run_time)
self.run_time += delta_time
else:
self.set_state(2, self.start_run_time + inter[0] - self.run_time)
self.run_time = inter[0]
if self.state == 2:
delta_time = time - self.start_run_time
inter = self._get_interruption(self.run_time, delta_time + self.run_time)
if time - self.start_block_time >= inter[1]:
self.set_state(0, time)
def __repr__(self):
return f'runtime: {self.run_time}, start: {self.first_run_time}, finish time {self.finish_time}'
def _get_interruption(self, start, end):
for i in self.interruptions:
if start <= i[0] <= end:
return i
return None