我正在为嵌入式系统开发调度程序。 该调度程序将每隔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时,所有进程都会在同一时刻(一个接一个)被调用,这可能会延迟从此处正确执行。
这可以通过为每个进程添加延迟(但保留其调用频率)来解决,因此频率停止是彼此的倍数。我的问题是我不知道如何计算应用于每个过程的延迟,以便最大限度地减少碰撞次数。
是否有任何已知的算法或某些数学指导?
谢谢。
答案 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 ...
我确信你可以概括这个想法,但只有你能真正改变静态间隔时它才有用。
如果你不能改变间隔,并且你也需要严格遵守它们,那么我有点不幸,因为没有参数可以改变:)