Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
las3_pub
/
simso
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
9aed003b
authored
Dec 06, 2020
by
Michael Schmid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
seems to work correctly now
parent
6ae843e2
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
64 additions
and
29 deletions
+64
-29
script.py
+5
-2
script_proba.py
+8
-3
simso/core/EventQueue.py
+31
-0
simso/core/Processor.py
+14
-15
simso/core/Scheduler.py
+5
-8
simso/core/Task.py
+1
-1
No files found.
script.py
View file @
9aed003b
...
@@ -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
=
2
0
*
configuration
.
cycles_per_ms
configuration
.
duration
=
10
0
*
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"
...
...
script_proba.py
View file @
9aed003b
...
@@ -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
)
simso/core/EventQueue.py
0 → 100644
View file @
9aed003b
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
simso/core/Processor.py
View file @
9aed003b
...
@@ -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
)
simso/core/Scheduler.py
View file @
9aed003b
...
@@ -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
))
...
...
simso/core/Task.py
View file @
9aed003b
...
@@ -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
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment