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
930ac7c0
authored
4 years ago
by
Michael Schmid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit before trying process as member
parent
8e0c1920
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
66 additions
and
54 deletions
+66
-54
simso/core/Job.py
+14
-10
simso/core/Monitor.py
+6
-6
simso/core/Processor.py
+25
-18
simso/core/Scheduler.py
+1
-1
simso/core/Task.py
+12
-12
simso/core/Timer.py
+6
-5
simso/core/results.py
+1
-1
simso/schedulers/SCHED_DEADLINE.py
+1
-1
No files found.
simso/core/Job.py
View file @
930ac7c0
...
...
@@ -28,7 +28,7 @@ class Job(Process):
:type etm: AbstractExecutionTimeModel
:type sim: Model
"""
Process
.
__init__
(
self
,
env
=
sim
,
generator
=
self
.
activate_job
())
# TODO: what to pass as generator?
Process
.
__init__
(
self
,
env
=
sim
,
generator
=
self
.
activate_job
())
self
.
_task
=
task
self
.
_pred
=
pred
self
.
instr_count
=
0
# Updated by the cache model.
...
...
@@ -50,7 +50,10 @@ class Job(Process):
self
.
_on_activate
()
self
.
context_ok
=
True
# The context is ready to be loaded.
self
.
processor_ok
=
self
.
_sim
.
event
()
self
.
context_ok
=
self
.
_sim
.
event
()
self
.
context_ok
.
succeed
()
self
.
context_ready
=
True
def
is_active
(
self
):
"""
...
...
@@ -64,7 +67,7 @@ class Job(Process):
self
.
_etm
.
on_activate
(
self
)
def
_on_execute
(
self
):
self
.
_last_exec
=
self
.
_sim
.
now
()
self
.
_last_exec
=
self
.
_sim
.
now
self
.
_etm
.
on_execute
(
self
)
if
self
.
_is_preempted
:
...
...
@@ -78,7 +81,7 @@ class Job(Process):
def
_on_stop_exec
(
self
):
if
self
.
_last_exec
is
not
None
:
self
.
_computation_time
+=
self
.
_sim
.
now
()
-
self
.
_last_exec
self
.
_computation_time
+=
self
.
_sim
.
now
-
self
.
_last_exec
self
.
_last_exec
=
None
def
_on_preempted
(
self
):
...
...
@@ -95,7 +98,7 @@ class Job(Process):
self
.
_on_stop_exec
()
self
.
_etm
.
on_terminated
(
self
)
self
.
_end_date
=
self
.
_sim
.
now
()
self
.
_end_date
=
self
.
_sim
.
now
self
.
_monitor
.
observe
(
JobEvent
(
self
,
JobEvent
.
TERMINATED
))
self
.
_task
.
end_job
(
self
)
self
.
_task
.
cpu
.
terminate
(
self
)
...
...
@@ -104,7 +107,7 @@ class Job(Process):
def
_on_abort
(
self
):
self
.
_on_stop_exec
()
self
.
_etm
.
on_abort
(
self
)
self
.
_end_date
=
self
.
_sim
.
now
()
self
.
_end_date
=
self
.
_sim
.
now
self
.
_aborted
=
True
self
.
_monitor
.
observe
(
JobEvent
(
self
,
JobEvent
.
ABORTED
))
self
.
_task
.
end_job
(
self
)
...
...
@@ -183,7 +186,7 @@ class Job(Process):
Dynamic laxity of the job in ms.
"""
return
(
self
.
absolute_deadline
-
self
.
ret
)
*
self
.
_sim
.
cycles_per_ms
-
self
.
_sim
.
now
()
)
*
self
.
_sim
.
cycles_per_ms
-
self
.
_sim
.
now
@property
def
computation_time
(
self
):
...
...
@@ -201,7 +204,7 @@ class Job(Process):
return
int
(
self
.
_computation_time
)
else
:
return
(
int
(
self
.
_computation_time
)
+
self
.
_sim
.
now
()
-
self
.
_last_exec
)
self
.
_sim
.
now
-
self
.
_last_exec
)
@property
def
actual_computation_time
(
self
):
...
...
@@ -290,7 +293,7 @@ class Job(Process):
return
self
.
_pred
def
activate_job
(
self
):
self
.
_start_date
=
self
.
_sim
.
now
()
self
.
_start_date
=
self
.
_sim
.
now
# Notify the OS.
self
.
_task
.
cpu
.
activate
(
self
)
...
...
@@ -298,7 +301,8 @@ class Job(Process):
while
self
.
_end_date
is
None
:
# Wait an execute order.
try
:
yield
self
.
_sim
.
event
()
yield
self
.
processor_ok
self
.
processor_ok
=
self
.
_sim
.
event
()
except
Interrupt
:
pass
else
:
...
...
This diff is collapsed.
Click to expand it.
simso/core/Monitor.py
View file @
930ac7c0
...
...
@@ -18,7 +18,7 @@ class Monitor(list):
def
observe
(
self
,
y
,
t
=
None
):
"""record y and t"""
if
t
is
None
:
t
=
self
.
env
.
now
()
if
t
is
None
:
t
=
self
.
env
.
now
self
.
append
([
t
,
y
])
def
tally
(
self
,
y
):
...
...
@@ -32,7 +32,7 @@ class Monitor(list):
def
reset
(
self
,
t
=
None
):
"""reset the sums and counts for the monitored variable """
self
[:]
=
[]
if
t
is
None
:
t
=
self
.
env
.
now
()
if
t
is
None
:
t
=
self
.
env
.
now
self
.
startTime
=
t
def
tseries
(
self
):
...
...
@@ -81,14 +81,14 @@ class Monitor(list):
The time-weighted average of the monitored variable.
If t is used it is assumed to be the current time,
otherwise t = self.sim.now
()
otherwise t = self.sim.now
"""
N
=
self
.
__len__
()
if
N
==
0
:
return
None
if
t
is
None
:
t
=
self
.
env
.
now
()
if
t
is
None
:
t
=
self
.
env
.
now
sum
=
0.0
tlast
=
self
[
0
][
0
]
ylast
=
self
[
0
][
1
]
...
...
@@ -107,12 +107,12 @@ class Monitor(list):
""" the time - weighted Variance of the monitored variable.
If t is used it is assumed to be the current time,
otherwise t = self.sim.now
()
otherwise t = self.sim.now
"""
N
=
self
.
__len__
()
if
N
==
0
:
return
None
if
t
is
None
:
t
=
self
.
env
.
now
()
if
t
is
None
:
t
=
self
.
env
.
now
sm
=
0.0
ssq
=
0.0
tlast
=
self
[
0
][
0
]
...
...
This diff is collapsed.
Click to expand it.
simso/core/Processor.py
View file @
930ac7c0
...
...
@@ -54,11 +54,12 @@ class Processor(Process):
cls
.
_identifier
=
0
def
__init__
(
self
,
model
,
proc_info
):
Process
.
__init__
(
self
,
env
=
model
,
generator
=
self
.
run
())
# TODO: what to pass as generator?
Process
.
__init__
(
self
,
model
,
self
.
run
())
self
.
_model
=
model
self
.
_internal_id
=
Processor
.
_identifier
Processor
.
_identifier
+=
1
self
.
identifier
=
proc_info
.
identifier
self
.
name
=
proc_info
.
name
self
.
_running
=
None
self
.
was_running
=
None
self
.
_evts
=
deque
([])
...
...
@@ -70,7 +71,8 @@ class Processor(Process):
self
.
_cl_overhead
=
proc_info
.
cl_overhead
self
.
_migration_overhead
=
proc_info
.
migration_overhead
self
.
set_caches
(
proc_info
.
caches
)
self
.
timer_monitor
=
Monitor
(
env
=
model
,
name
=
"Monitor Timer"
+
proc_info
.
name
)
self
.
timer_monitor
=
Monitor
(
env
=
model
,
name
=
"Monitor Timer"
+
proc_info
.
name
)
self
.
_speed
=
proc_info
.
speed
def
resched
(
self
):
...
...
@@ -143,34 +145,37 @@ class Processor(Process):
"""
return
self
.
_running
def
waituntil
(
self
,
cond_func
,
delay
=
1
):
while
not
cond_func
():
yield
self
.
env
.
timeout
(
delay
)
def
run
(
self
):
while
True
:
if
not
self
.
_evts
:
job
=
self
.
_running
if
job
:
yield
self
.
waituntil
(
lambda
:
job
.
context_ok
)
# yield job.context_ok
while
not
job
.
context_ready
:
yield
self
.
_model
.
timeout
(
1
)
self
.
monitor
.
observe
(
ProcCxtLoadEvent
())
yield
self
.
_model
.
timeout
(
self
.
cl_overhead
)
# overhead load context
# overhead load context
yield
self
.
_model
.
timeout
(
self
.
cl_overhead
)
self
.
monitor
.
observe
(
ProcCxtLoadEvent
(
terminated
=
True
))
job
.
interruptReset
()
self
.
env
.
reactivate
(
job
)
# job.interruptReset() # TODO: does this interrupt need handling?
job
.
processor_ok
.
succeed
()
job
.
processor_ok
=
self
.
_model
.
event
()
self
.
monitor
.
observe
(
ProcRunEvent
(
job
))
job
.
context_
ok
=
False
job
.
context_
ready
=
False
else
:
self
.
monitor
.
observe
(
ProcIdleEvent
())
# Wait event.
yield
self
.
waituntil
(
lambda
:
self
.
_evts
)
while
not
self
.
_evts
:
yield
self
.
_model
.
timeout
(
1
)
if
job
:
self
.
interrupt
(
job
)
self
.
_model
.
interrupt
(
job
)
self
.
monitor
.
observe
(
ProcCxtSaveEvent
())
yield
self
.
_model
.
timeout
(
self
.
cs_overhead
)
# overhead save context
# overhead save context
yield
self
.
_model
.
timeout
(
self
.
cs_overhead
)
self
.
monitor
.
observe
(
ProcCxtSaveEvent
(
terminated
=
True
))
job
.
context_ok
=
True
# job.context_ok = self._model.event()
job
.
context_ready
=
True
evt
=
self
.
_evts
.
popleft
()
if
evt
[
0
]
==
RESCHED
:
...
...
@@ -193,7 +198,7 @@ class Processor(Process):
elif
evt
[
0
]
==
TIMER
:
self
.
timer_monitor
.
observe
(
None
)
if
evt
[
1
]
.
overhead
>
0
:
print
(
self
.
env
.
now
()
,
"hold"
,
evt
[
1
]
.
overhead
)
print
(
self
.
_model
.
now
,
"hold"
,
evt
[
1
]
.
overhead
)
yield
self
.
_model
.
timeout
(
evt
[
1
]
.
overhead
)
evt
[
1
]
.
call_handler
()
elif
evt
[
0
]
==
SPEED
:
...
...
@@ -201,9 +206,11 @@ class Processor(Process):
elif
evt
[
0
]
==
RESCHED
:
self
.
monitor
.
observe
(
ProcOverheadEvent
(
"Scheduling"
))
self
.
sched
.
monitor_begin_schedule
(
self
)
yield
self
.
waituntil
(
self
.
sched
.
get_lock
)
while
not
self
.
sched
.
get_lock
:
yield
self
.
_model
.
timeout
(
1
)
decisions
=
self
.
sched
.
schedule
(
self
)
yield
self
.
_model
.
timeout
(
self
.
sched
.
overhead
)
# overhead scheduling
# overhead scheduling
yield
self
.
_model
.
timeout
(
self
.
sched
.
overhead
)
if
type
(
decisions
)
is
not
list
:
decisions
=
[
decisions
]
decisions
=
[
d
for
d
in
decisions
if
d
is
not
None
]
...
...
This diff is collapsed.
Click to expand it.
simso/core/Scheduler.py
View file @
930ac7c0
...
...
@@ -130,7 +130,7 @@ class Scheduler(object):
- **sim**: :class:`Model <simso.core.Model.Model>` instance.
\
Useful to get current time with ``sim.now_ms()`` (in ms) or
\
``sim.now
()
`` (in cycles).
``sim.now`` (in cycles).
- **processors**: List of :class:`processors
\
<simso.core.Processor.Processor>` handled by this scheduler.
- **task_list**: List of :class:`tasks <simso.core.Task.GenericTask>`
\
...
...
This diff is collapsed.
Click to expand it.
simso/core/Task.py
View file @
930ac7c0
...
...
@@ -266,7 +266,7 @@ class GenericTask(Process):
self
.
_activations_fifo
.
popleft
()
if
len
(
self
.
_activations_fifo
)
>
0
:
self
.
job
=
self
.
_activations_fifo
[
0
]
self
.
env
.
activate
(
self
.
job
,
self
.
job
.
activate_job
())
self
.
_sim
.
process
(
self
.
job
.
activate_job
())
def
_job_killer
(
self
,
job
):
if
job
.
end_date
is
None
and
job
.
computation_time
<
job
.
wcet
:
...
...
@@ -281,15 +281,15 @@ class GenericTask(Process):
"""
self
.
_job_count
+=
1
job
=
Job
(
self
,
"{}_{}"
.
format
(
self
.
name
,
self
.
_job_count
),
pred
,
monitor
=
self
.
_monitor
,
etm
=
self
.
_etm
,
sim
=
self
.
env
)
monitor
=
self
.
_monitor
,
etm
=
self
.
_etm
,
sim
=
self
.
_sim
)
if
len
(
self
.
_activations_fifo
)
==
0
:
self
.
job
=
job
self
.
env
.
process
(
job
.
activate_job
())
self
.
_sim
.
process
(
job
.
activate_job
())
self
.
_activations_fifo
.
append
(
job
)
self
.
_jobs
.
append
(
job
)
timer_deadline
=
Timer
(
self
.
env
,
GenericTask
.
_job_killer
,
timer_deadline
=
Timer
(
self
.
_sim
,
GenericTask
.
_job_killer
,
(
self
,
job
),
self
.
deadline
)
timer_deadline
.
start
()
...
...
@@ -307,7 +307,7 @@ class ATask(GenericTask):
def
execute
(
self
):
self
.
_init
()
yield
self
.
env
.
event
()
yield
self
.
_sim
.
event
()
class
PTask
(
GenericTask
):
...
...
@@ -320,13 +320,13 @@ class PTask(GenericTask):
def
execute
(
self
):
self
.
_init
()
# wait the activation date.
yield
self
.
env
.
timeout
(
int
(
self
.
_task_info
.
activation_date
*
yield
self
.
_sim
.
timeout
(
int
(
self
.
_task_info
.
activation_date
*
self
.
_sim
.
cycles_per_ms
))
while
True
:
# print self.sim.now
()
, "activate", self.name
# print self.sim.now, "activate", self.name
self
.
create_job
()
yield
self
.
env
.
timeout
(
int
(
self
.
period
*
self
.
_sim
.
cycles_per_ms
))
yield
self
.
_sim
.
timeout
(
int
(
self
.
period
*
self
.
_sim
.
cycles_per_ms
))
class
SporadicTask
(
GenericTask
):
...
...
@@ -340,8 +340,8 @@ class SporadicTask(GenericTask):
self
.
_init
()
for
ndate
in
self
.
list_activation_dates
:
yield
self
.
env
.
timeout
(
int
(
ndate
*
self
.
_sim
.
cycles_per_ms
)
\
-
self
.
_sim
.
now
()
)
yield
self
.
_sim
.
timeout
(
int
(
ndate
*
self
.
_sim
.
cycles_per_ms
)
\
-
self
.
_sim
.
now
)
self
.
create_job
()
@property
...
...
@@ -360,8 +360,8 @@ class ProbabilisticTask(GenericTask):
self
.
_init
()
for
ndate
in
self
.
list_activation_dates
:
yield
self
.
env
.
timeout
(
int
(
ndate
*
self
.
_sim
.
cycles_per_ms
)
\
-
self
.
_sim
.
now
()
)
yield
self
.
_sim
.
timeout
(
int
(
ndate
*
self
.
_sim
.
cycles_per_ms
)
\
-
self
.
_sim
.
now
)
self
.
create_job
()
@property
...
...
This diff is collapsed.
Click to expand it.
simso/core/Timer.py
View file @
930ac7c0
...
...
@@ -8,7 +8,8 @@ from simpy import Environment, Process, Interrupt
class
InstanceTimer
(
Process
):
def
__init__
(
self
,
timer
):
Process
.
__init__
(
self
,
env
=
timer
.
env
,
generator
=
self
.
run
())
Process
.
__init__
(
self
,
env
=
timer
.
_sim
,
generator
=
self
.
run
())
self
.
_sim
=
timer
.
_sim
self
.
function
=
timer
.
function
self
.
args
=
timer
.
args
self
.
delay
=
timer
.
delay
...
...
@@ -25,12 +26,12 @@ class InstanceTimer(Process):
self
.
running
=
True
while
self
.
running
:
try
:
yield
self
.
env
.
timeout
(
self
.
delay
)
yield
self
.
_sim
.
timeout
(
self
.
delay
)
except
Interrupt
:
break
else
:
if
not
self
.
running
:
break
;
break
if
self
.
cpu
:
self
.
cpu
.
timer
(
self
)
else
:
...
...
@@ -72,7 +73,7 @@ class Timer(object):
Methods:
"""
self
.
env
=
sim
self
.
_sim
=
sim
self
.
function
=
function
self
.
args
=
args
if
in_ms
:
...
...
@@ -94,7 +95,7 @@ class Timer(object):
Start the timer.
"""
self
.
instance
=
InstanceTimer
(
self
)
self
.
env
.
process
(
self
.
instance
.
run
())
# TODO: , self.prior what's with this?
self
.
_sim
.
process
(
self
.
instance
.
run
())
# TODO: , self.prior what's with this?
def
stop
(
self
):
"""
...
...
This diff is collapsed.
Click to expand it.
simso/core/results.py
View file @
930ac7c0
...
...
@@ -335,7 +335,7 @@ class Results(object):
Get the observation window.
"""
if
self
.
_observation_window
is
None
:
self
.
_observation_window
=
(
0
,
self
.
model
.
now
()
)
self
.
_observation_window
=
(
0
,
self
.
model
.
now
)
return
self
.
_observation_window
def
set_observation_window
(
self
,
window
):
...
...
This diff is collapsed.
Click to expand it.
simso/schedulers/SCHED_DEADLINE.py
View file @
930ac7c0
...
...
@@ -83,7 +83,7 @@ class SCHED_DEADLINE(Scheduler):
if
(
cpu_min
.
running
is
None
or
self
.
cbs_servers
[
cpu_min
.
running
.
task
]
.
current_deadline
>
self
.
cbs_servers
[
job
.
task
]
.
current_deadline
):
print
(
self
.
sim
.
now
()
,
job
.
name
,
cpu_min
.
name
)
print
(
self
.
sim
.
now
,
job
.
name
,
cpu_min
.
name
)
# start runtime timer of the new server selected
self
.
cbs_servers
[
job
.
task
]
.
timer_runtime
=
Timer
(
self
.
sim
,
SCHED_DEADLINE
.
runtime_call
,
...
...
This diff is collapsed.
Click to expand it.
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