- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验报告
实验名称:最早期限优先调度算法(EDF)实验
一、 实验目的
1) 了解实时调度,了解最早截止期优先算法(EDF算法);
2) 使用C语言实现最早截止期优先算法(EDF算法);
3) 计算多个任务的调度顺序。
二、 实验原理
最早截止期优先算法(EDF),也称为最早死限调度算法(DDS),是一种采用动态调度的优先级调度算法,任务的优先级根据任务的截止时间来确定。任务的截止时间越近,任务的优先级越高;任务的截止时间越远,任务额优先级越低。当有新的任务处于就绪状态时,任务的优先级就有可能需要进行调整。
EDF算法的测试
如果所有的任务都是周期性的,并且对应的时间限等于它们的周期,对任务集的调度性的测试是非常简单的:如果任务集的总利用率不大于1,那么任务集就可以由EDF算法在一个单处理器上进行合理的调度。对于那些任务的时间限并不全等于其周期的情况,没有简答的调度性测试。在这样的情况下,需要使用EDF算法生成一个时间表,来判断是不是在一个给定的时间区间内所有的时间限都被满足。在这种情况下EDF的一个可调度性测试如下:
定义u=i=1n(ei/Pi),dmax=max1≤i≤n{di}以及P=lcm(P1,…Pn)(这里的“lcm”表示最小公倍数)。定义hT(t)是任务集T中所有满足其时间限的绝对值小鱼t的任务执行时间之和。一个由n个任务构成的集合不是可行的EDF的充分必要条件是:
u1或存在某个tmin{P+dmax,u1-umax1≤i≤n{Pi-di}} 使得hTtt
(其中n为任务集中任务的数量;ei为任务Ti的执行时间;Pi为周期任务的周期;di为任务Ti的相对时间限;hTt为在绝对时间不迟于t的任务集合T中,所有重复的任务执行时间和。)
三、 实验仪器
硬件:PC机;
软件:Windows7,Visual Studio 2010集成开发环境
四、 实验步骤
1) 理解EDF调度算法的原理并通过实例用EDF算法判断多任务的调度顺序。
2) 新建EDF.h 头文件,在其中定义变量,结构体,函数。
3) 新建input.c文件,用input函数从键盘获取多个任务的名称、执行时间、周期和释放时间,将任务分成一个个时间片存在数组中,并输出数组和各时间片属性。
4) 新建edf.c文件,用EDF函数将数组中的时间片根据截止时间的大小从小到大进行排序,输出它们的截止时间排序,再判断是否可调度,若是不可调度输出“不可调度!”,若是可调度输出调度顺序。
5) 新建main.c文件,在其中调用input函数和EDF函数。
6) 编译运行程序,输入多个任务调试程序至结果无误。
7) 对实验进行分析、反思,与同学讨论。
五、 实验结果
程序完成后,输入了多种情况进行验证,运行结果正确,符合按照最早截止期优先算法得出的结果。
1)不可调度
当五个任务的执行时间和周期都为1时,是不可调度的。(由EDF算法的测试可知)
2)可调度
当五个任务的执行时间和周期分别为1、3,2、12,1、6,1、4,3、20,释放时间分别为0,1,0,1,0时,是可调度的。结果如下:
六、 实验分析与讨论
1)编程前要理解清楚算法。对算法理解不清就编写代码实现,那么写出来的程序与计算出来的结果会不一致、运行不正确。重新理解算法,调试程序,会造成不必要的时间浪费。
2)实验前一定要做好实验设计。如变量设置,功能语句设计等。否则在编写程序的过程中容易出现思维逻辑不清晰,无法继续实现必需功能的问题。这样仍然会造成不必要的时间浪费。
附:源代码
//EDF.h
#include stdio.h
#include windows.h
#define n 5
int number;
int schedule[1000][2];
int FS[1000][2];
struct Program{
int name;
int run;
int period;
int release;
}A[1000];
void Input();
void EDF();
//input.c
/*************输入*************/
#includeEDF.h
void Input()
{
// program A[n];
char s;
int i,j,k;
int name,run,period,release;
number=0;
for(i=0;i5;i++)/*i是任务个数*/
{
????????????????printf( Programs name,Execution time,Period(=Deadline),Release time: );
????????????????scanf( %d %d %d %d,name,run,
文档评论(0)