forked from khchenTW/MissRateSimulator
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask.py
More file actions
98 lines (76 loc) · 3.48 KB
/
task.py
File metadata and controls
98 lines (76 loc) · 3.48 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
# further developed by Jannik Drögemüller, Mats Haring, Franziska Schmidt and Simon Koschel
import random
class Task:
def __init__(self, taskid, period, deadline, execution, prob = 0):
self.id = taskid
self.period = period
self.deadline = deadline
self.execution = execution
self.abnormal_exe = execution
self.activeJobs = []
# 0 is the highest priority
self.priority = -1
self.processor = -1
self.prob = prob
def __getitem__(self,key):
return getattr(self,key)
class Job(object):
def __init__(self, deadline, workload):
self.deadline = deadline
self.workload = workload
def __str__(self):
return "deadline: " + str(self.deadline) + ", workload: " + str(self.workload)
def __repr__(self):
return "deadline: " + str(self.deadline) + ", workload: " + str(self.workload)
def earliestDeadline(self):
if len(self.activeJobs) > 0:
return self.activeJobs[0].deadline
else:
return None
def lastDeadline(self):
if len(self.activeJobs) > 0:
return self.activeJobs[-1].deadline
else:
return None
def workload(self):
wl = 0
for job in self.activeJobs:
wl += job.workload
return wl
def updateWorkload(self, delta):
if self.workload() > delta:
print("BUG: Actual workload of Task " + str(self.id) + " is less than " + str(delta) + ".")
else:
while delta > 0 and len(self.activeJobs) > 0:
job = self.activeJobs[0]
if delta >= job.workload:
delta -= job.workload
self.activeJobs.pop(0)
else:
job.workload -= delta
delta = 0
def addJob(self, faultRate, currentTime):
if faultRate == 0:
self.activeJobs.append(self.Job(self.deadline + currentTime, self.execution))
elif faultRate == 1:
self.activeJobs.append(self.Job(self.deadline + currentTime, self.abnormal_exe))
else:
if random.randint(0,int(1/faultRate)-1) > int(1/faultRate)-2:
self.activeJobs.append(self.Job(self.deadline + currentTime, self.abnormal_exe))
else:
self.activeJobs.append(self.Job(self.deadline + currentTime, self.execution))
def updateDeadline(self, delta):
for job in self.activeJobs:
job.deadline -= delta
def setAbnormalExe(self, abnormal_exe):
self.abnormal_exe = abnormal_exe
def setPriority(self, prio):
self.priority = prio
def setProcessor(self, processor):
self.processor = processor
def convertToArr(self):
return [self.id, self.period, self.deadline, self.execution, self.abnormal_exe, self.priority, self.processor, self.prob]
def __str__(self):
return "id: " + str(self.id) + ", period: " + str(self.period) + ", deadline: " + str(self.deadline) + ", execution: " + str(self.execution) + ", priority: " + str(self.priority) + ", processor: " + str(self.processor) + ", jobs: " + str(self.activeJobs)
def __repr__(self):
return "id: " + str(self.id) + ", period: " + str(self.period) + ", deadline: " + str(self.deadline) + ", execution: " + str(self.execution) + ", priority: " + str(self.priority) + ", processor: " + str(self.processor) + ", jobs: " + str(self.activeJobs)