使用 Simpy 模拟嵌入式固件的离散事件
Discrete Event Simulating Embedded Firmware using Simpy
假设我有 3 个任务:
def task1():
if check_if_theres_work_to_do(): #just checking takes 2us
do_work() #takes 10us
task2 和 task3 定义相似
我有一个 CPU。一种常见的嵌入式方法是执行以下操作:
def round_robin():
while True:
task1()
task2()
task3()
现在,我想在 Simpy 中对此进行模拟,但我不想在没有任何任务可做的情况下不断循环 round_robin
代码(因为这会增加模拟时间) ,但我一次只希望一项任务能够 运行。此外,我想模拟这样一个事实,即当工作可用时,例如对于 task2,执行 task2() 之前可能需要一些时间(处理器正忙于检查其他任务是否有工作要做/是否正在为其他任务工作)。
在 Simpy 中,我定义了任务,使每个任务都产生了一个事件(例如,工作项进入队列):
def task1():
work_item = yield task1_work_queue.get()
do_task1_work(work_item)
但是如果我使用 env.process(task1()); env.process(task2()); env.process(task3())
,那么它们可以全部 运行 并行,这不能准确地模拟 while 循环的行为。
我认为的一种方法可能是定义一个名为 CPU、cpu = Resource()
的资源,然后让任务在获得 work_item 时产生,然后在获得 [=] 时产生38=],然后产生 0 到 2*其他任务数量之间的随机时间量:
def task1():
work_item = yield task1_work_queue.get()
with cpu.request() as req:
yield req
yield env.timeout(4)
do_task1_work(work_item)
但这看起来有点混乱,因为任务必须知道 cpu 正在执行多少其他任务。
是否有更好的建模方法?我是否应该在请求 cpu 然后等待开始工作时有一个进程 yield,但是等待工作可以中断(这样没有工作的任务不会阻止有工作的任务)?
您可以编写一个将所有任务放入队列的进程(例如,Store
具有无限容量)。
然后您的 "cpu" 可以执行以下操作:
def cpu(env, work_q):
while True:
task, args = yield work_q.get()
yield env.timeout(3) # task setup
yield env.process(task(*args)) # run actual task
假设我有 3 个任务:
def task1():
if check_if_theres_work_to_do(): #just checking takes 2us
do_work() #takes 10us
task2 和 task3 定义相似
我有一个 CPU。一种常见的嵌入式方法是执行以下操作:
def round_robin():
while True:
task1()
task2()
task3()
现在,我想在 Simpy 中对此进行模拟,但我不想在没有任何任务可做的情况下不断循环 round_robin
代码(因为这会增加模拟时间) ,但我一次只希望一项任务能够 运行。此外,我想模拟这样一个事实,即当工作可用时,例如对于 task2,执行 task2() 之前可能需要一些时间(处理器正忙于检查其他任务是否有工作要做/是否正在为其他任务工作)。
在 Simpy 中,我定义了任务,使每个任务都产生了一个事件(例如,工作项进入队列):
def task1():
work_item = yield task1_work_queue.get()
do_task1_work(work_item)
但是如果我使用 env.process(task1()); env.process(task2()); env.process(task3())
,那么它们可以全部 运行 并行,这不能准确地模拟 while 循环的行为。
我认为的一种方法可能是定义一个名为 CPU、cpu = Resource()
的资源,然后让任务在获得 work_item 时产生,然后在获得 [=] 时产生38=],然后产生 0 到 2*其他任务数量之间的随机时间量:
def task1():
work_item = yield task1_work_queue.get()
with cpu.request() as req:
yield req
yield env.timeout(4)
do_task1_work(work_item)
但这看起来有点混乱,因为任务必须知道 cpu 正在执行多少其他任务。
是否有更好的建模方法?我是否应该在请求 cpu 然后等待开始工作时有一个进程 yield,但是等待工作可以中断(这样没有工作的任务不会阻止有工作的任务)?
您可以编写一个将所有任务放入队列的进程(例如,Store
具有无限容量)。
然后您的 "cpu" 可以执行以下操作:
def cpu(env, work_q):
while True:
task, args = yield work_q.get()
yield env.timeout(3) # task setup
yield env.process(task(*args)) # run actual task