最早期限优先调度算法(EDF)实验报告材料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验名称:最早期限优先调度算法(EDF )实验
一、 实验目的
1) 了解实时调度,了解最早截止期优先算法(EDF 算法);
2) 使用C 语言实现最早截止期优先算法(EDF 算法); 3) 计算多个任务的调度顺序。
二、 实验原理
最早截止期优先算法(EDF ),也称为最早死限调度算法(DDS ),是一种采用动态调度的优先级调度算法,任务的优先级根据任务的截止时间来确定。任务的截止时间越近,任务的优先级越高;任务的截止时间越远,任务额优先级越低。当有新的任务处于就绪状态时,任务的优先级就有可能需要进行调整。
EDF 算法的测试
如果所有的任务都是周期性的,并且对应的时间限等于它们的周期,对任务集的调度性的测试是非常简单的:如果任务集的总利用率不大于1,那么任务集就可以由EDF 算法在一个单处理器上进行合理的调度。对于那些任务的时间限并不全等于其周期的情况,没有简答的调度性测试。在这样的情况下,需要使用EDF 算法生成一个时间表,来判断是不是在一个给定的时间区间所有的时间限都被满足。在这种情况下EDF 的一个可调度性测试如下:
定义u =∑(e i /P i )n i=1,d max =max 1≤i≤n
{d i }以及P =lcm(P 1,…P
n )(这里的“lcm ”表示最小公倍数)。定义ℎT (t)是任务集T 中所有满足其时间限的绝对值小鱼t 的任务执行时间之和。一个由n 个任务构成的集合不是可行的EDF 的充分必要条件是:
u >1或存在某个t u 1−u max 1≤i≤n {P i −d i }} 使得ℎT (t )>t (其中n 为任务集中任务的数量;e i 为任务T i 的执行时间;P i 为周期任务的周期;d i 为任务T i 的相对时间限;ℎT (t )为在绝对时间不迟于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 #include 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 /*************输入*************/ #include"EDF.h" void Input() { // program A[n]; char s; int i,j,k; int name,run,period,release; number=0; for(i=0;i<5;i++)/*i是任务个数*/ { printf("Program's name,Execution time,Period(=Deadline),Release time:"); scanf("%d %d %d %d",&name,&run,&period,&release); k=0; while(k<5)/*k是周期数*/ { for(j=0;j { A[number].name=name; A[number].run=1; A[number].period=period; A[number].release=release+k*period; number++; } fflush(stdin);/*清空缓冲区*/ k++; } } printf("\n"); printf("What you input is:\n"); for(i=0;i