Commit 9aed003b by Michael Schmid

seems to work correctly now

parent 6ae843e2
...@@ -19,18 +19,21 @@ def main(argv): ...@@ -19,18 +19,21 @@ def main(argv):
configuration.cycles_per_ms = 1 configuration.cycles_per_ms = 1
configuration.duration = 20 * configuration.cycles_per_ms configuration.duration = 100 * configuration.cycles_per_ms
# Add tasks: # Add tasks:
configuration.add_task(name="T1", identifier=1, period=7, configuration.add_task(name="T1", identifier=1, period=7,
activation_date=0, wcet=3, deadline=7) activation_date=0, wcet=3, deadline=7)
configuration.add_task(name="T2", identifier=2, period=12, configuration.add_task(name="T2", identifier=2, period=12,
activation_date=0, wcet=3, deadline=8) activation_date=0, wcet=3, deadline=8)
configuration.add_task(name="T4", identifier=4, period=15,
activation_date=0, wcet=5, deadline=14)
configuration.add_task(name="T3", identifier=3, period=20, configuration.add_task(name="T3", identifier=3, period=20,
activation_date=0, wcet=5, deadline=9) activation_date=0, wcet=5, deadline=9)
# Add a processor: # Add a processor:
configuration.add_processor(name="CPU 1", identifier=1) configuration.add_processor(name="CPU 1", identifier=1, cs_overhead=1)
configuration.add_processor(name="CPU 2", identifier=2, cs_overhead=1)
# Add a scheduler: # Add a scheduler:
#configuration.scheduler_info.filename = "../simso/schedulers/RM.py" #configuration.scheduler_info.filename = "../simso/schedulers/RM.py"
......
...@@ -25,16 +25,20 @@ def main(argv): ...@@ -25,16 +25,20 @@ def main(argv):
# Add tasks: # Add tasks:
configuration.add_task(name="T1", identifier=1, configuration.add_task(name="T1", identifier=1,
activation_date=0, pwcet=[(2,0.5), (4,0.5)],pmit=[(5,0.2),(6,0.8)], deadline=6, task_type = "Probabilistic",abort_on_miss=True) activation_date=0, pwcet=[(2, 0.5), (4, 0.5)], pmit=[(5, 0.2), (6, 0.8)], deadline=5, task_type="Probabilistic", abort_on_miss=True)
configuration.add_task(name="T2", identifier=2, configuration.add_task(name="T2", identifier=2,
activation_date=0, pwcet=[(3,0.5),(4,0.5)],pmit=[(5,0.5), (7, 0.5)], deadline=7, task_type = "Probabilistic",abort_on_miss=True) activation_date=0, pwcet=[(3, 0.5), (4, 0.5)], pmit=[(7, 0.5), (8, 0.5)], deadline=7, task_type="Probabilistic", abort_on_miss=True)
configuration.add_task(name="T3", identifier=3,
activation_date=0, pwcet=[(3, 0.5), (4, 0.5)], pmit=[(8, 0.5), (9, 0.5)], deadline=8, task_type="Probabilistic", abort_on_miss=True)
# Add a processor: # Add a processor:
configuration.add_processor(name="CPU 1", identifier=1) configuration.add_processor(name="CPU 1", identifier=1)
configuration.add_processor(name="CPU 2", identifier=2)
# Add a scheduler: # Add a scheduler:
configuration.scheduler_info.filename = "./simso/schedulers/DM_mono.py" configuration.scheduler_info.filename = "./simso/schedulers/RM.py"
# Check the config before trying to run it. # Check the config before trying to run it.
configuration.check_all() configuration.check_all()
...@@ -49,4 +53,5 @@ def main(argv): ...@@ -49,4 +53,5 @@ def main(argv):
for log in model.logs: for log in model.logs:
print(log) print(log)
main(sys.argv) main(sys.argv)
from collections import deque
from simpy import Event
class EventQueue:
"""
Class for events happening in a processor
"""
def __init__(self, env):
self._env = env
self._evt_deque = deque([])
self.item_ready_event = self._env.event()
def append(self, item):
self._evt_deque.append(item)
if not self.item_ready_event.triggered:
self.item_ready_event.succeed()
def clear_events(self, event_type):
self._evt_deque = deque(
[e for e in self._evt_deque if e[0] != event_type])
def popleft(self):
return self._evt_deque.popleft()
def is_empty(self):
return not bool(self._evt_deque)
def get_deque(self):
return self._evt_deque
...@@ -6,6 +6,7 @@ from simpy import Process ...@@ -6,6 +6,7 @@ from simpy import Process
from simso.core.ProcEvent import ProcRunEvent, ProcIdleEvent, \ from simso.core.ProcEvent import ProcRunEvent, ProcIdleEvent, \
ProcOverheadEvent, ProcCxtSaveEvent, ProcCxtLoadEvent ProcOverheadEvent, ProcCxtSaveEvent, ProcCxtLoadEvent
from simso.core.Monitor import Monitor from simso.core.Monitor import Monitor
from simso.core.EventQueue import EventQueue
RESCHED = 1 RESCHED = 1
ACTIVATE = 2 ACTIVATE = 2
...@@ -61,7 +62,7 @@ class Processor: ...@@ -61,7 +62,7 @@ class Processor:
self.name = proc_info.name self.name = proc_info.name
self._running = None self._running = None
self.was_running = None self.was_running = None
self._evts = deque([]) self._evts = EventQueue(model)
self.sched = model.scheduler self.sched = model.scheduler
self.monitor = Monitor(env=model, name="Monitor" + proc_info.name) self.monitor = Monitor(env=model, name="Monitor" + proc_info.name)
self._caches = [] self._caches = []
...@@ -86,10 +87,12 @@ class Processor: ...@@ -86,10 +87,12 @@ class Processor:
def terminate(self, job): def terminate(self, job):
self._evts.append((TERMINATE, job)) self._evts.append((TERMINATE, job))
if self._running == job:
self._running = None self._running = None
def preempt(self, job=None): def preempt(self, job=None):
self._evts = deque([e for e in self._evts if e[0] != PREEMPT]) # self._evts = deque([e for e in self._evts if e[0] != PREEMPT])
self._evts.clear_events(PREEMPT)
self._evts.append((PREEMPT,)) self._evts.append((PREEMPT,))
self._running = job self._running = job
...@@ -147,8 +150,9 @@ class Processor: ...@@ -147,8 +150,9 @@ class Processor:
def run(self): def run(self):
while True: while True:
if not self._evts: if self._evts.is_empty():
job = self._running job = self._running
self._evts.item_ready_event = self._model.event()
if job: if job:
yield job.context_ok yield job.context_ok
self.monitor.observe(ProcCxtLoadEvent()) self.monitor.observe(ProcCxtLoadEvent())
...@@ -162,24 +166,19 @@ class Processor: ...@@ -162,24 +166,19 @@ class Processor:
self.monitor.observe(ProcIdleEvent()) self.monitor.observe(ProcIdleEvent())
# Wait event. # Wait event.
first_yield = True yield self._evts.item_ready_event
while not self._evts: if job and job.process.is_alive:
if first_yield:
yield self._model.timeout(0)
first_yield = False
else:
yield self._model.timeout(1)
if job and job.is_active():
job.process.interrupt() job.process.interrupt()
self.monitor.observe(ProcCxtSaveEvent()) self.monitor.observe(ProcCxtSaveEvent())
# overhead save context # overhead save context
yield self._model.timeout(self.cs_overhead) yield self._model.timeout(self.cs_overhead)
self.monitor.observe(ProcCxtSaveEvent(terminated=True)) self.monitor.observe(ProcCxtSaveEvent(terminated=True))
job.context_ok = self._model.event() job.context_ok = self._model.event()
job.context_ok.succeed()
evt = self._evts.popleft() evt = self._evts.popleft()
if evt[0] == RESCHED: if evt[0] == RESCHED:
if any(x[0] != RESCHED for x in self._evts): if any(x[0] != RESCHED for x in self._evts.get_deque()):
self._evts.append(evt) self._evts.append(evt)
continue continue
...@@ -206,8 +205,8 @@ class Processor: ...@@ -206,8 +205,8 @@ class Processor:
elif evt[0] == RESCHED: elif evt[0] == RESCHED:
self.monitor.observe(ProcOverheadEvent("Scheduling")) self.monitor.observe(ProcOverheadEvent("Scheduling"))
self.sched.monitor_begin_schedule(self) self.sched.monitor_begin_schedule(self)
while not self.sched.get_lock: lock_request = self.sched.get_lock()
yield self._model.timeout(1) yield lock_request
decisions = self.sched.schedule(self) decisions = self.sched.schedule(self)
# overhead scheduling # overhead scheduling
yield self._model.timeout(self.sched.overhead) yield self._model.timeout(self.sched.overhead)
...@@ -243,5 +242,5 @@ class Processor: ...@@ -243,5 +242,5 @@ class Processor:
assert len(set(running_tasks)) == len(running_tasks), \ assert len(set(running_tasks)) == len(running_tasks), \
"Try to run a job on 2 processors simultaneously!" "Try to run a job on 2 processors simultaneously!"
self.sched.release_lock() self.sched.release_lock(lock_request)
self.sched.monitor_end_schedule(self) self.sched.monitor_end_schedule(self)
...@@ -6,6 +6,7 @@ import importlib ...@@ -6,6 +6,7 @@ import importlib
import pkgutil import pkgutil
import inspect import inspect
from simpy import Resource
from simso.core.Monitor import Monitor from simso.core.Monitor import Monitor
from simso.core.SchedulerEvent import SchedulerBeginScheduleEvent, \ from simso.core.SchedulerEvent import SchedulerBeginScheduleEvent, \
SchedulerEndScheduleEvent, SchedulerBeginActivateEvent, \ SchedulerEndScheduleEvent, SchedulerBeginActivateEvent, \
...@@ -141,7 +142,7 @@ class Scheduler(object): ...@@ -141,7 +142,7 @@ class Scheduler(object):
self.sim = sim self.sim = sim
self.processors = [] self.processors = []
self.task_list = [] self.task_list = []
self._lock = False self._lock = Resource(sim)
self.overhead = scheduler_info.overhead self.overhead = scheduler_info.overhead
self.overhead_activate = scheduler_info.overhead_activate self.overhead_activate = scheduler_info.overhead_activate
self.overhead_terminate = scheduler_info.overhead_terminate self.overhead_terminate = scheduler_info.overhead_terminate
...@@ -213,17 +214,13 @@ class Scheduler(object): ...@@ -213,17 +214,13 @@ class Scheduler(object):
Implement a lock mechanism. Override it to remove the lock or change Implement a lock mechanism. Override it to remove the lock or change
its behavior. its behavior.
""" """
if not self._lock: return self._lock.request()
self._lock = True
else:
return False
return True
def release_lock(self): def release_lock(self, request):
""" """
Release the lock. Goes in pair with :meth:`get_lock`. Release the lock. Goes in pair with :meth:`get_lock`.
""" """
self._lock = False self._lock.release(request)
def monitor_begin_schedule(self, cpu): def monitor_begin_schedule(self, cpu):
self.monitor.observe(SchedulerBeginScheduleEvent(cpu)) self.monitor.observe(SchedulerBeginScheduleEvent(cpu))
......
...@@ -266,7 +266,7 @@ class GenericTask: ...@@ -266,7 +266,7 @@ class GenericTask:
self._activations_fifo.popleft() self._activations_fifo.popleft()
if len(self._activations_fifo) > 0: if len(self._activations_fifo) > 0:
self.job = self._activations_fifo[0] self.job = self._activations_fifo[0]
self._sim.process(self.job.activate_job()) self.job.process = self._sim.process(self.job.activate_job())
def _job_killer(self, job): def _job_killer(self, job):
if job.end_date is None and job.computation_time < job.wcet: if job.end_date is None and job.computation_time < job.wcet:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment