寻找不同的调度算法的有限状态机的比较(Looking for a comparison of dif

2019-06-27 00:38发布

是否有良好的资源,让不同的调度算法的有限状态机(FSM)在嵌入式系统中没有安装操作系统很好的比较(书籍,网站)?

我设计一个简单的嵌入式Web服务器没有安装操作系统。 我想知道什么是用于调度发生在系统中的不同事件的处理的各种方法。

例如,如果两个事件抵达的同时是如何发生的事件优先? 如果我分配到的事件不同的优先级,我怎么保证高优先级的事件被首先处理? 如果更高的优先级事件进来,而正处理的事件,怎么能确保该事件立即处理?

我打算用FSM来检查事件的到来,各种条件,然后才能正常调度处理的事件。 由于嵌入式Web服务器没有一个操作系统,我使用的是考虑循环执行的方式。 不过,我想看看,可以在这种方法中,可以使用不同的算法的优劣进行了比较。

Answer 1:

您声明:“我的意思是比如像调度condion,如果两个任务到达的同时,其任务需要优先和嵌入式Web服务器呈三角其他情形。”

我解释为:“是用什么来确定哪些任务被第一个(计划)时,多个任务同时到达执行的一套规则。”

我用您的术语,“任务”来说明的相似性。 但是克利福是正确的。 正确的术语应该是“事件”或“消息”。

当你说“调度状态”我想你指的“设置的决定事件的时间表规则”。

算法的定义是: 一个进程或一套规则应遵循的计算或其他解决问题的操作,ESP。 通过一台电脑。

从题为调度算法 :

考虑到必须处理的,随着时间推移到达岗位序列的计算机的中央处理单元。 在什么样的顺序应该工作,以尽量减少被处理,平均一个工作是在系统中到达规定时间内完成?

再次,听起来像你叫什么“调度条件”。

我提起这事,因为使用正确的词来形容你在找什么可以帮助我们(SO社区)给你更好的答案。 并会帮助你,你对自己的进一步的研究。

如果我对你的问题的解释依然是不是你心目中,请让我知道在特定的,我说的是什么,是错误的,我会再试一次。 也许更多的一些例子可以帮助我更好地理解。

一些进一步阅读的调度(这是你问的):

  1. 当然,一个很好的出发点是在维基百科文章的调度原则
  2. 比你正在寻找,但仍然充满了对调度的详细信息的位较低的水平是高层次综合调度算法 ( 注:无论什么原因,PDF具有以相反的顺序页,以便在底部开始)

优先级的中断调度的例子:

以一个体系结构,其中优先级0是最高的。 两个事件同时进来了。 一个具有优先级2和其他具有优先级3.调度算法开始处理与优先级2的一个,因为它具有更高的优先级。

正在被处理时具有优先级2的情况下,与优先级0另一事件进来。调度中断事件具有优先级2和优先级为0处理事件。

当它处理完优先级为0时,它返回到处理优先级2的事件。 当它处理完优先级2的事件,它处理的优先级3的事件。

最后,当它与处理所有优先级中断来完成,它返回控制到处理事件,其中优先级没有关系的主要处理任务。

一个例证:

在上图中,“任务”是超级循环这DIPSWITCH提及或在无限循环main()发生在一个循环的执行 ,你提到的。 “事件”是在超级循环运行或中断由上述可见,如果他们需要优先的各种程序。

条款搜索的优先级中断和控制流 。 有一些很好的阅读材料是托珀斯核心规格 (其中我从图像)时, ARM中断体系 ,并在纸80196中断体系 。

我提托珀斯核心规格只是因为这是我从得到的图像。 但在任何实时的心脏操作系统是它的调度算法和中断架构。

该“事件”处理你问将由微处理器/微控制器的中断子系统来处理。 你如何构建的优先级,以及如何处理非优先级事件是什么使你的调度算法的全部。

协同调度的例子:

typedef struct {
    void   (*task)(void); // Pointer to the task function.
    uint32_t period;      // Period to execute with.
    uint32_t delay;       // Delay before first call.
} task_type;

volatile uint32_t elapsed_ticks = 0;
task_type tasks[NUM_TASKS];

void Dispatch_Tasks(void)
{
    Disable_Interrupts();
    while (elapsed_ticks > 0) { // TRUE only if the ISR ran.
        for (uint32_t i = 0; i < NUM_TASKS; i++) {
            if (--tasks[i].delay == 0) {
                tasks[i].delay = tasks[i].period;

                Enable_Interrupts();
                tasks[i].task(); // Execute the task!
                Disable_Interrupts();
            }
        }
        --elapsed_ticks;
    }
    Enable_Interrupts();
}

// Count the number of ticks yet to be processed.
void Timer_ISR(void)
{
    ++elapsed_ticks;
}

上面的例子是采取从标题博客文章“简单合作社计划” 。

一次合作的调度是一个超级循环和定时器中断的组合。 从第2.4节中无阻塞硬件编码嵌入式系统 :

的协同调度基本上是两个先前所讨论的调度器的组合。 一个定时器设定在固定时间间隔,这将是不同任务的最小时间分辨率中断。 然后,将每个任务分配一个周期是中断间隔的最小分辨率的倍数。 函数然后不断呼吁以更新已达到其中断周期内各个任务和运行任务的中断次数。 这导致在具有超容量与时间触发调度的时机可靠性的可扩展性调度。 这是为传感器系统通常使用的调度器。 然而,这种类型的调度是不是没有它的局限性。 它仍然是重要的,在合作的调度任务调用短。 如果一个任务块长于一个定时器中断周期,时间紧迫的任务可能会被错过。

而对于深入分析多,这里是从一纸国际期刊的电子与计算机科学 。

抢先与合作:

一项合作计划程序无法处理异步事件没有某种形式的一个抢占在它上面运行的算法。 这方面的一个例子是一个多级队列结构。 在此方面的讨论,可参见本文的CPU调度。 有,当然,利弊各。 其中的几个本中描述的短条在RTKernel-32。

至于“可以(图中的等)满足基于优先级的任务调度任何特定类型的抢占式调度调度进程”,任何基于优先级中断控制器本质上是抢占。 如果您计划每次中断一个任务,它将执行如图表所示。



Answer 2:

如果我知道这个问题的意思,答案仍然很可能是米罗萨梅克的实践UML状态图中的C / C ++,第二版:适用于嵌入式系统事件驱动编程



文章来源: Looking for a comparison of different scheduling algorithms for a Finite State Machine