2017-07-25 46 views
1

比方说,我有3个任务模拟嵌入式固件。一个常见的嵌入式方法是做到以下几点:离散事件使用的simpy

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时获得任务产出,然后在获取cpu时产生收益,然后产生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时拥有一个进程产量,然后等待正在进行的工作,但是可以让工作中的等待中断(以便没有工作的任务不会阻止确实有效的任务)?

回答

1

您可以编写一个将所有任务放入队列的进程(例如,具有无限容量的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 
+0

谢谢,我结束了创建从资源继承了CPU的对象和定义的方法上叫块。产生cpu.block(process_time)产生一个本身产生self.request()的进程,然后产生self.env.timeout(process_time)。然后我从我的任务中产生cpu.block()。 – sheridp