如何在一段时间内传播流程,获得最少数量的“冲突”

时间:2010-01-16 15:31:04

标签: algorithm math scheduling

我正在为嵌入式系统开发调度程序。 该调度程序将每隔X毫秒调用每个进程;当然,这个时间可以为每个过程单独配置。

所有内容都经过编码,并按照应有的方式调用每个进程;我面临的问题是: 想象一下,我分别每10,15,5和30毫秒设置4个进程:

A: 10ms
B: 15ms  
C: 5ms 
D: 30ms

随着时间推移产生的呼叫将是:

                       A          |
       A   B   A       B          |
    C  C   C   C   C   C   C      | processes being called
                       D          |
----------------------------------
0   5  10  15  20  25  30  35...    ms

问题在于,当达到30ms时,所有进程都会在同一时刻(一个接一个)被调用,这可能会延迟从此处正确执行。

这可以通过为每个进程添加延迟(但保留其调用频率)来解决,因此频率停止是彼此的倍数。我的问题是我不知道如何计算应用于每个过程的延迟,以便最大限度地减少碰撞次数。

是否有任何已知的算法或某些数学指导?

谢谢。

4 个答案:

答案 0 :(得分:3)

给定一组间隔,您可以通过在评论中找到Jason所提到的least common multiple来找到开始时间重合的时间(假设没有偏移)。您可以通过对一组任务执行区间的素数因子分解来找到LCM。

但似乎greatest common divisor(或最大公因子GCF)可能是最有用的数字。该数字将为您提供重复发生的间隔。在您的示例中,GCF为5. GCF为5时,可以为每个任务添加1,2,3等的初始偏移,以避免重叠开始时间。因此,如果GCF为5,则最多可以有5个任务,其启动时间永远不会重叠。 GCF为20时,您可以安排最多20个任务,没有重叠的开始时间。如果两个(或更多)任务是相对素数(GCF = 1),那么如果间隔永远不会改变,无论你用于那些任务的偏移量,肯定会发生重叠。

答案 1 :(得分:1)

没有完美的解决方案,它们会不时发生碰撞。 我建议在循环长度上添加微小的(0.01-0.1ms)随机值,所以从长远来看,它们很少会同时调用。

或者,如果你有5ms的调度程序粒度,第一个线程总是在X + 1ms调用,第二个调用在X + 2,等等,所以总是保证1ms不间断运行(如果你有10个线程,那么它将是X + 0.5,X + 1,X + 1.5)。但实施起来可能会非常棘手。

答案 2 :(得分:1)

这种问题直接涉及实时编程和调度算法的领域。我在大学里上过这门课,如果我记得很清楚,Rate-monotonic scheduling就是你要找的算法。

这个想法是您为与其周期成反比的作业分配优先级,即周期越小,优先级越高。但是,如果你可以打断你的工作并在以后恢复它们,那么效果会更好。

还有其他选择,例如EDF (earliest deadline first),但这些是动态调度算法(即优先级在执行期间分配)。

答案 3 :(得分:0)

简单的解决方案是更改调用子例程的计划。即而不是5,10,15和30毫秒,你可以住,例如5,15,15和30?然后你可以使用以下模式:(A = 5 ms proc,B,C = 15 ms proc,D = 30 ms proc):

 AAAAAAAAAAAAAAAAAAAA ...
 B  B  B  B  B  B  B  ...
  C  C  C  C  C  C  C ...
   D     D     D      ...

我确信你可以概括这个想法,但只有你能真正改变静态间隔时它才有用。

如果你不能改变间隔,并且你也需要严格遵守它们,那么我有点不幸,因为没有参数可以改变:)