实时调度及相关算法
引言: 随着计算机的发展,多道程序处理的出现需要强大的调度算法来对多任务进行调度,以确定多任务环境下任务的执行顺序以及占有 CPU 时间。相对于静态、不可抢占的调度方法, EDF 的出现使之凭借灵活性高、 CPU 占有率高很快成为最优的单处理器调度算法。
实时系统是那些时间因素非常关键的系统。例如,计算机的一个或多个外设发出信号,计算机必须在一段固定时间内作出适当的反应。一些实例是:医院里特护病房的监控系统、飞行器中的自动驾驶仪以及核反应堆中的安全控制系统等。在这些系统中,迟到的响应即使正确,也和没有响应一样糟糕。
实时系统通常分为硬实时(hard real time)系统和软实时(soft real time)系统。硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。比如航天中的宇宙飞船的控制等就是现实中这样的系统。其他的所有有实时特性的系统都可以称之为软实时系统。如果明确地来说,软实时系统就是那些从统计的角度来说,一个任务(在下面的论述中,我们将对任务和进程不作区分)能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误,像实时多媒体系统就是一种软实时系统。 这两种系统中,实时性的获得是通过将程序分成许多进程,而每个进程的行为都预先可知。这些进程通常生存周期都很短,往往在一秒内便运行结束。当检测到一个外部事件时,调度程序按满足它们最后期限的方式调度这些进程。
实时系统要响应的事件进一步分为周期性和非周期性。一个系统可能必须响应多个周期的事件流。根据每个事件需要多长的处理时间,系统可能根本来不及处理所有事件。例如,有m个周期性事件,事件I的周期为Pi,其中每个事件需要Ci秒的CPU时间来处理则只有满足以下条件
时,才可能处理所有的负载。满足该条件的实时系统称作是可调度的(schedulable)。
实现实时调度的基本条件
- 提供必要的信息
- 就绪时间
- 开始截止时间和完成截止时间
- 处理时间
- 资源要求
- 优先级
- 系统处理能力要强
- 采用抢占式调度机制
- 具有快速切换机制
调度方法的分类
对于大量的实时调度方法来说,主要存在以下几种划分方法:
1、离线( off-line )和在线( on-line )调度
根据获得调度信息的时机,调度算法可以分为离线调度和在线调度两类。对 于离线调度算法,运行过程中使用的调度信息在系统运行之前就确定了,如时间驱动的调度。离线调度算法具有确定性,但缺乏灵活性 ,适用于特征能够预先确定,且不容易发生变化的应用。在线调度算法的调度信息则在系统运行过程中动态获得,如优先级驱动的调度(如 EDF,RMS 等)。在线调度算法在形成最佳调度决策上具有较大的灵活性。
2,抢占( preemptive )和非抢占( non-preemptive )调度
根据 任务在运行过程中能否被打断的处理情况。调度算法分为抢占式调度和非抢占式调度两类。在抢占式调度方法中,正在运行的任务可能被其他任务打断。在非抢占式调度算法中,一旦任务开始运行,该任务只有在运行完成而主动放弃 CPU 资源,或是因为等待其他资源被阻塞的情况下才会停止运行。实时内核大都采用了抢占式调度算法,使关键任务能够打断非关键任务执行,确保关键任务的截止时间能够得到满足。相对来说,抢占式调度算法要更复杂些,且需要更多的资源,并可能在使用不当的情况下造成低优先级任务出现长时间得不到执行的情况。非抢占式调度算法常用于那些任务需要按照预先确定的顺序执行,且只有当任务主动放弃 CPU 资源后,其他任务才能得到执行的情况。
3, 静态( static )和动态( dynamic )调度
根据任务优先级的确定时机,调度算法分为静态调度和动态调度两类。在静态调度算法中,所有任务的优先级在设计时已经确定下来,且在运行过程中不会发生变化(如 RMS )。在动态调度算法中,任务的优先级则在运行过程中确定,并可能不断发生变化(如 EDF )。静态调度算法适用于能够完全把握系统中所有任务及其时间约束(如截至时间、运行时间、优先顺序和运行过程中的到达时间)特性的情况。静态调度比较简单,但缺乏灵活性,不利于系统扩展;动态调度有足够的灵活性来处理变化的系统情况,但需要消耗更多的系统资源。
常用实时调度算法
最早截止时间算法(EDF)
最早截止期限优先(EDF)调度根据截止期限动态分配优先级。**截止期限越早,优先级越高;截止期限越晚,优先级越低。**其在实时任务队列中也就越接近队首。调度程序每次均从该队列中选择第一个任务投入运行。此算法可用于抢占式非抢占式调度算法。
根据 EDF 策略,当一个进程可运行时,它应向系统公布截止期限要求。优先级可能需要进行调整,以便反映新可运行进程的截止期限。注意单调速率调度与 EDF 调度的不同,前者的优先级是固定的。
wekipedia上面对于单调速率调度(固定优先级抢占式调度)介绍:
固定优先级抢占式调度是实时系统中常用的调度系统。使用固定优先级的抢占式调度,调度程序可确保在任何给定时间,处理器执行所有当前准备执行的任务中的最高优先级任务。
在抢占式调度具有时钟中断任务,可提供调度的选项来切换任务于一定时期内执行时间片。该调度系统的优点是确保在比时间片更长的时间内没有任何任务会占用处理器。但是,这种调度方案容易受到进程或线程锁定的影响:由于优先级较高的任务被赋予了优先级,因此优先级较低的任务可能会等待不确定的时间。解决这种情况的一种常见方法是老化,它逐渐增加了等待进程和线程的优先级,以确保它们最终都将执行。
下面是EDF算法抢占式:
如果使用固定优先级(A优先级高):
(B优先级高):
结合两者出现第三种方式----抢占式EDF算法:
注意:当t=100时,B2和A5截止时间相同,但为了减少因为切换进程的系统开销而选择继续原来的进程。
最低松弛度优先算法(LLF)
优先级倒置现象: