EDFwithOE - 一种单处理机实时系统进程调度算法EDF改进算法的探讨与模拟
本人经过本学期操作系统课程的学习以及个人兴趣做了一些关于实时任务系统进程调度算法的研究,根据单处理机实时任务进程调度算法EDF的抢占式EDF模型探讨了一种改进算法的可能,并予以简单模拟加以实现。
一. 最早截止时间优先算法EDF
Earliest deadline first(EDF) 最早截止时间优先算法。
EDF在调度时,任务的优先级根据任务的截止时间动态分配。截止时间越短,优先级越高。如果一个任务集负载U<=1,则是可调度的。EDF 调度算法已被证明是动态最优调度, 而且是充要条件。处理机利用率最大可达100% 。但瞬时过载时, 系统行为不可预测, 可能发生多米诺骨牌现象, 一个任务丢失时会引起一连串的任务接连丢失。
这个算法包含以下概念与关键词:
1. 实时系统 实时系统与其他操作系统不同在于计算机要能及时响应外部事件的请求,对外部请求在严格时间范围内做出反应,有高可靠性和完备性.为达到时间要求,进程的调度策略就显得尤为重要,EDF就是一种实时系统的进程调度算法。
2. 周期性任务与非周期性任务 实时系统的任务按产生请求的频率可分为周期性任务(例如视频流音频流)与非周期性任务(例如对输入端的响应)。
3. 截止时间 Deadline,又称最终期限,Deadline是EDF算法判断优先级的依据。其中周期性任务有硬Deadline,即周期,到期后马上开始新请求,而非周期性任务只要求软Deadline,系统做出响应即可。
4. 动态优先级调度 EDF总是执行最终期限最早的任务。该算法给就绪队列中的各个进程根据它们的截止期限来分配优先级,具有最近的截止期限的进程具有最高的优先级。优先级的计算是根据系统时间片循环进行的,所以EDF是一个动态优先级的算法。
5. 抢占式PDF模型 抢占式EDF 调度算法是最优的单一处理器调度算法。模型有四个前提,并以此得出给定周期性任务可调度的充分必要条件。正是对这个模型的思考才有了EDFwithOE。
二. EDFwithOE
Earliest deadline first with overhead expenses(EDFwithOE),考虑任务总开销的最早截止时间最优先算法。
它的提出与探讨如下:
一.抢占式EDF模型:
抢占式EDF 调度算法对于给定周期性任务集可调度性的充分必要条件为:
其中ei为任务执行时间,Pi为任务周期,由此式可知只要处理器的利用率不超过100%,就能保证它的可调度性。它是基于下面的四个假设得出的:
1) 任何任务不存在不可抢占的部分,且抢占代价可忽略;
2) 只是处理器请求是有意义的;内存,IO,和其他资源的请求可忽略;
3) 所有的任务都是无关的;不存在次序的约束;
4) 任务的最终期限与它的周期相等。
二.EDFwithOE算法据此的改进
1) OE的提出:
WithOE就是考虑了抢占代价和其他请求的一种优化,加入了对执行上下文和上下文切换的时间预估,作为一个总开销overhead expenses 到给定任务集可调度性的条件中去,即ei = ei + OE 。
2) 减少抢占:
很明显的,EDFwithOE的可调度性任务集合是EDF集合的子集,,即减少了任务被抢占的机会,节约了抢占引起的上下文切换等额外开销。
3) 避免瞬时过载:
EDF可使处理机利用率最大达100%,但瞬时过载时,系统行为不可预测,,可能发生多米诺骨牌现象,,一个任务丢失时会引起一连串的任务接连丢失。而有了OE,就可预判抢占所造成周期任务不能完成的情况,减少和避免瞬时过载的情况。
4) CPU利用率与速度:
加入了OE后CPU利用率和EDF一样最高也可达到100%,但达到的机会不多。OE是子在线下(OFF LINE)计算的,即静态的,可提高调度的速度。
三. 混合调度
实时任务系统的进程通常会即包含周期性任务也包含非周期性任务,所以混合调度就是研究的重点与难点,本人以EDFwithOE算法为核心实现周期性任务与非周期性任务的混合调度。
下页是调度流程图:
EDFwithOE混合调度流程图
该调度系统有以下关键步骤与思想:
1)判断系统是否繁忙:用户可自行调整系统繁忙的阈值,当ere实时系统中周期性任务集的可调度性大于这个阈值时判ere定系统繁忙。
2)紧急调度:有紧急周期性任务(临近deadline – OE)时的调ere度策略。
3)周期性任务调度:在系统繁忙时只调度周期性任务。
4)混合调度:系统空闲时混合调度周期与非周期性任务。
5)调度算法:EDFwithOE,改进的动态优先级算法。
四. PROCESS SIMULATION
(一) 如何实现EDFwithOE与实现的前提
本系统是对单处理机实时系统混合调度的简单模拟。其中混合调度模块是依据EDFwithOE 算法来实现,实现的逻辑请参照上一页内容。系统总体结构分为界面操作和混合调度两大模块。界面操作有新建,结束,阻塞,唤醒进程,显示进程调度状态等。
实现前提:
1)由于本系统是对单处理机实时系统的模拟,所以真正运行诶2的进程只能有一个
2)为实现简单,只能主动阻塞和唤醒(界面操作)非周期性进诶2程。
3)为集中反映出进程调度中最本质的东西,本系统尽可能的诶2控制输入,创建进程时给出下拉选项(选择要创建的进程而诶2不是自己定制一个进程)。
4)由于非周期任务任意时间间隔内可能产生不定数量请求诶2的特点,它的服务时间即为OE,而周期性任务在本系统中表诶2现为一个请求任务集,服务时间为deadline的倍数,dead-诶2line一到就开始后续请求。
为什么是模拟而不是仿真?
本系统实现平台为.NET Framfork 4.0,实现形式为windows窗体。选择windows窗体程序来实现是因为本系统更侧重于展示(本人觉得这样更有意思些),况且也不是把时间完全同步(对每个任务都有独立的维护),谈不上仿真。仿真最好需要在嵌入式设备的系统中去实验,而且需要大量的实验。
(二) 总体结构设计
系统设计类关系视图如下:
Process Simulation类关系视图
说明: 左起第1第2两列为事件和对应的代理。第3为三个静态类,第4为抽象为进程的结构类,这四个类为本系统的核心。其中第一个静态类封装以EDFwithOE为依据的动态优先级算法;第二个静态类存储进程队列;第三个静态类为混合调度模块。第5为两个枚举类型(为安全把进程的种类和状态封装为枚举型)。第6为界面控制窗体;第7为vs10(本系统编制所用IDE)自动生成类。
(三) 关键抽象与设计
本系统的关键抽象是Process类。系统创建进程时创建此类的对象。
本系统的进程类封装了以下属性:
进程名
进程类型(非周期性与周期性)
进程ID(创建次序)
进程状态(运行,就绪,等待,阻塞,结束)
进程请求时间(被创建时间)
进程计时器1:自请求经过时间(直到OE被完成一直记录)
进程计时器2:服务时间(阻塞或等待时暂停记录)
进程计时器3:用来判断是否到达最终期限
进程服务时间
进程最终期限
进程优先级(最终期限与计时器1的差值)
本系统存储进程由ProcessCollection类负责,里面是用.NET LIST<T>数据结构来实现的进程队列,T为Process型。
有以下进程队列:
总进程队列(只要被创建的进程对会入此队列)
非周期性任务队列
周期性任务队列
运行队列
本系统的调度流程封装在ProcessControl类,在实现时用单独线程绑定此类FastScheduling方法实时调度。
此类有以下关键方法:
FastScheduling:调度线程绑定的方法,调用以下几个抽离的方法:
UrgencyScheduling:紧急调度
PTPriorityCalculating:周期性任务调度方法
IntergratePriorityCalculating:混合调度方法
Preempting:抢占算法
JudgeBusy:检查系统是否繁忙
JudgeFinished:检查是否有任务完成(花费完OE)
JudgeOver:检查是否有进程结束(到达服务时间)
JudgeDeadline:检查是否有周期性任务到达deadline,到达则开始下一请求
进程调度所用到的EDFwithOE的改进动态优先级算法封装在EDFwithOverheadExpenses类里。
方法(每个方法内都会计算进程的优先级):
EDF:系统空闲时混合调度周期性任务与非周期性任务进程队列
EDFwithRealTime:系统繁忙时调用周期性任务进程队列
SingleCalculate:计算单独的运行进程的优先级
除Process类需要创建出不同的进程对象外,另三个类都静态实现,保证效率与共享性。
(四) 交互操作界面
本系统操作界面见下页:
ProcessSimulation主控界面
ProcessSimulation创建进程界面
ProcessSimulation系统设置界面
说明: 主控界面:包含对进程的各种操作:创建;结束;阻塞;唤醒;设置。同时提供动态显示进程消息的RichTextBox。
进程创建界面:创建进程,可选择要创建的进程。
系统设置界面:系统设置,可对系统繁忙阈值和系统时间片(调度间隔时间)进行设置。