最低松弛度优先Word文档下载推荐.docx
《最低松弛度优先Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最低松弛度优先Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
可以在界面安排周期性实时任务的个数与相关的指标值,又及要求仿真的时间长度
3)系统可又对设定的任务条件进行检查,如果无法满足公式的要求,则弹出相应的错误提示,并重新进入任务安排界面
4)可读取样例数据(要求存放在外部文件中)进行周期性实时任务数、周期长度、执行时间的初始化
5)采用可视化界面,数据载入后按最低松弛度算法进行调度,可以在运行中动态显示各进程的状态:
就绪、执行、完成
6)系统上下文切换时,会暂停调度,显示就绪队列中各任务的松弛度,按任意键后自动运行
7)具有一定的数据容错性
三、系统分析与设计
1、系统分析
(1)该算法根据实时任务的松弛度来确定任务的优先级,任务的松弛度愈低,其优先级愈高,以使之优先执行。
(2)松弛度=必须完成的时间-其本身的运行时间-当前时间
(3)要求系统中有一个按松弛度排序的实时任务就绪队列。
(4)该算法主要用于可抢占调度方式中,当一任务的最低松弛度减为0时,它便立即抢占CPU,以保证按截止时间的要求完成任务。
2、系统设计:
2.1、模块设计:
2.2、数据结构说明:
publicclassprocess
{
privatestringpname;
//进程名
privateintperiod;
//周期长度
privateintcputime;
//需要的cpu时间
privateintremaintime;
//剩余需执行的时间
privateintarrivetime;
//每个周期的到达时间
privateintpnum;
//所处周期数
privateintlaxity;
//松弛度
privateintpriority;
//优先级
}
(1)进程名
用来标识一个进程
(2)周期长度
周期性实时任务必须有周期长度
(3)需要的cpu时间
周期性实时任务必须有每个周期需要的执行时间
(4)剩余需执行的时间
用来判断是否发生抢占,假设在按松弛度排序的就绪队列中,任务a松弛度最小,
任务b次之,若任务a需要的cpu时间大于任务b的松弛度,则在任务a的这次调度中
会发生抢占,则任务a该周期的剩余需执行的时间大于0,反之,剩余需执行的时间等
于0时,则这次调度过程中不会发生抢占。
(5)每个周期的到达时间
用来进行排序,系统要求有一个按松弛度排序的实时任务就绪队列,若松弛度相同,
则按到达时间排序。
(6)所处周期数
对于周期性实时任务,应该有所处的周期数,其次,计算松弛度时算任务必须完成
的时间可以用所处周期数和周期长度相乘得到。
(7)松弛度
最低松弛度优先调度算法肯定要求计算松弛度。
(8)优先级
同样也是为了排序使用,在松弛度和到达时间都相同的时候,按固定的优先级进行排序,优先级在添加实时任务时动态生成。
2.3、算法流程图:
1、数据初始化
1.1界面直接添加
1.2从文件中读取数据
2、动态显示各进程的状态和画出调度图
四、系统测试与调试分析
1、系统测试
●测试方法:
黑盒测试
●测试技术:
功能测试
它是从使用者的角度来编写的,它关注系统提供的功能特征及其不同的处理条件;
测试功能的不同处理流程(包括正常处理的和异常处理);
一个功能测试用例仅用于测试一个功能,一个功能可能需要多个功能测试用例来覆盖。
●测试数据:
(1)课本例子(存在抢占的情况)
输入:
周期性实时任务的个数:
2
第一个实时任务(实时任务名,周期长度,执行时间):
A,20,10
第二个实时任务(实时任务名,周期长度,执行时间):
B,50,25
输出结果:
(2)不存在抢占
3
B,50,10
第三个实时任务(实时任务名,周期长度,执行时间):
C,50,15
(3)系统不可调度
第二个实时任务(实时任务名,周期长度,执行时间):
B,30,20
输出结果:
提示:
系统不可调度
●测试报告:
测试结果:
(2)不存在抢占的例子
测试说明
测试名称
采用最低松弛度优先调度的实时系统调度程序
测试目的
验证采用最低松弛度优先调度的实时系统调度程序调度的正确性
测试技术
测试方法
黑盒测试法
测试用例
测试内容
系统所实现的最低松弛度优先算法的正确性
测试步骤
输入周期性实时任务的个数,每个任务的实时任务名,周期长度和执行时间(存在抢占)
输入周期性实时任务的个数,每个任务的实时任务名,周期长度和执行时间(不存在抢占)
输入周期性实时任务的个数,每个任务的实时任务名,周期长度和执行时间(系统不可调度)
测试数据
a,20,10;
b,50,25
b,50,10;
c,50,15
b,30,20
预期结果
得出正确的调度图
给出相应的提示信息
测试结果
与预期相符
2、调试分析:
开始调试算法,在排序的时候一直有一个空引用异常,提示未将对象引用设置到对象的实例。
是因为没有实例化按松弛度排序的那个数组,根本上还是自己编程比较少的原因,平时学习语言的时候应该注意要多练习。
还有就是排序交换数据的时候出了点儿问题,还是因为编程不熟练的问题。
还有一个费了好长时间的问题就是暂停调度时,按任意键继续的问题,解决这个问题的时候在网上找了好长时间,网上没有现成的答案,有的也是控制台下按任意键继续的问题。
自己添加了一个窗体的键盘事件,可是一直没有成功触发这个事件,后来知道是焦点的问题,先得让窗体获得焦点,按任意键才能触发那个事件。
最后调试的比较多的就是最后动态显示的部分,为了显示的更合理。
开始以为还行,后来换了个例子还发现了比较多的问题,看来,自己编程序还是要更仔细。
五、用户手册
5.1使用平台
本系统使用操作系统为win7,需要安装visualstutio2010
5.2安装步骤
本系统无需安装,只需把exe文件拷贝到电脑上
5.3使用步骤
图1:
开始运行界面
图2:
输入数据
图3:
数据可从文件中读取
图4:
点击开始,开始动态显示
图5:
动态运行中各进程状态
图6:
调度结束
六、程序清单
最低松弛度优先算法:
privatevoidtimer1_Tick(objectsender,EventArgse)
//清空备注中的信息
for(inti=0;
i<
pro.Length;
i++)
listView2.Items[i].SubItems[4].Text="
"
;
}
boolflag=true;
intduration=0;
//本次调度执行的时间
intfirst=0;
intsecond=0;
intordfirst=0;
sortpro=newprocess[pro.Length];
sortpro[i]=newprocess(pro[i].Pname,pro[i].Period,pro[i].Cputime,pro[i].Remaintime,pro[i].Pnum,pro[i].Arrivetime,pro[i].Laxity,pro[i].Priority);
processproc=newprocess();
//对sortpro中的任务按松弛度从小到大进行排序,松弛度相同时按到达次序先后排序,到达时间相同时按固定优先级排序
//固定优先级:
在添加任务时,先添加的任务优先级高
sortpro.Length-1;
for(intj=i+1;
j<
sortpro.Length;
j++)
if(sortpro[j].Laxity<
sortpro[i].Laxity)
//交换所有属性信息
proc.Pname=sortpro[i].Pname;
……
sortpro[i].Pname=sortpro[j].Pname;
sortpro[j].Pname=proc.Pname;
elseif(sortpro[j].Laxity==sortpro[i].Laxity)
if(sortpro[j].Arrivetime<
sortpro[i].Arrivetime)
//交换所有属性信息
elseif(sortpro[j].Arrivetime==sortpro[i].Arrivetime)
{//交换所有属性信息
if(sortpro[j].Priority<
sortpro[i].Priority)
}//外层for循环
//找到sortpro中已到达的松弛度最低的进程
i++)
if(curtime<
(sortpro[i].Pnum-1)*sortpro[i].Period)
if(i!
=sortpro.Length-1)
continue;
else
//curtime到最近的周期
curtime=sortpro[0].Arrivetime;
for(intj=1;
if(sortpro[i].Arrivetime<
curtime)
curtime=sortpro[i].Arrivetime;
//重新计算松弛度
for(intj=0;
j<
pro.Length;
j++)
pro[j].Laxity=pro[j].Pnum*pro[j].Period-curtime-pro[j].Remaintime;
for(intj=0;
//在listview2中动态显示各任务信息
if(((pro[j].Pnum-1)*pro[j].Period<
curtime)||((pro[j].Pnum-1)*pro[j].Period==curtime))
listView2.Items[j].SubItems[1].Text=pro[j].Pnum.ToString();
listView2.Items[j].SubItems[2].Text=pro[j].Laxity.ToString();
listView2.Items[j].SubItems[3].Text="
就绪"
listView2.Items[j].SubItems[1].Text="
listView2.Items[j].SubItems[2].Text="
listView2.Items[j].SubItems[4].Text="
尚未到达"
flag=false;
ordfirst=i;
break;
}//尚未进入该周期的for循环
//如果sortpro中所有任务都没到达,则不执行if(flag)中的代码
if(flag)
{//找到松弛度最低和次低的任务
if(ordfirst<
pro.Length-1)
if(pro[i].Pname.Equals(sortpro[ordfirst].Pname))
first=i;
if(pro[i].Pname.Equals(sortpro[ordfirst+1].Pname))
second=i;
second=0;
//根据松弛度次低的任务的松弛度和松弛度最低的任务的执行时间确定duration
if(pro[first].Remaintime<
=pro[second].Laxity)
duration=pro[first].Remaintime;
duration=pro[second].Laxity;
//对duration的额外限制,closetime为要求仿真的时间长度
if((curtime+duration)>
closetime)
duration=closetime-curtime;
pro[first].Remaintime-=duration;
//画出本次调度的图形
for(inty=0;
y<
duration;
y++)
Penpen;
pen=newPen(Color.FromArgb(color[pro[first].Priority,0],color[pro[first].Priority,1],color[pro[first].Priority,2]));
grap.DrawLine(pen,(curtime+y)*2,0,(curtime+y)*2,30);
grap.DrawLine(pen,(curtime+y)*2+1,0,(curtime+y)*2+1,30);
//修改curtime
curtime+=duration;
//动态修改listview2中的信息
if(pro[first].Remaintime==0)
listView2.Items[first].SubItems[1].Text=pro[first].Pnum.ToString();
listView2.Items[first].SubItems[2].Text="
listView2.Items[first].SubItems[3].Text="
完成"
listView2.Items[first].SubItems[4].Text="
第"
+pro[first].Pnum+"
个周期运行了"
+duration+"
毫秒"
//更改本次被调度任务的相关属性
pro[first].Pnum++;
pro[first].Remaintime=pro[first].Cputime;
pro[first].Arrivetime=(pro[first].Pnum-1)*pro[first].Period;
timer1.Enabled=false;
display.Text="
上下文切换,按任意键继续……"
listView2.Items[second].SubItems[4].Text=pro[second].Pname+"
抢占cpu"
//窗体获得焦点
this.KeyPreview=true;
//暂停,等待按任意键
this.keybool=true;
//修改所有任务的松弛度
//显示本次未被调度的任务的状态
=first)
if(((pro[i].Pnum-1)*pro[i].Period<
curtime)||((pro[i].Pnum-1)*pro[i].Period==curtime))
listView2.Items[i].SubItems[1].Text=pro[i].Pnum.ToString();
listView2.Items[i].SubItems[2].Text=pro[i].Laxity.ToString();
listView2.Items[i].SubItems[3].Text="
listView2.Items[i].SubItems[1].Text="
listView2.Items[i].SubItems[2].Text="
}
}//if(flag)
//调度完成条件
if(curtime>
this.closetime||curtime==this.closetime)
this.timer1.Stop();
if(MessageBox.Show("
调度完成!
)==DialogResult.OK)
}//timer1_Tick
七、体会与自我评价
刚选这个题目的时候,那会儿还是挺愁的,因为要做成动态的可视化的,不知道到底该怎么实现。
到课设开始准备做了,就想着一点一点来吧。
我做的题目是采用最低松弛度优先调度的实时系统调度程序,所以首先研究的应该的是算法,在上课学习的时候觉得这个算法挺好理解的,可是换成计算机实现则不是那么的简单了。
计算机实现要考虑更多的细节,还有好多的边界问题,所以细心是必须的,还要认真思考。
研究完算法开始正式的写程序,首先解决的就是动态显示的问题,所以先研究画图。
动态画图的技术部分研究完之后就是动态画图和算法的结合,做这个的时候费了一点儿时间,主要还是写算法和调试算法用的时间比较长。
不过,等到真正实现的时候还是挺高兴的。
实现了最主要的部分之后,然后就是按照选题的设计要求一条一条的加东西。
加东西的时候首先费了点儿时间的是文件的部分,因为不熟悉,看书和上网看资料解决了这个问题。
然后就是动态显示的问题,关于应该显示哪些内容和具体怎么显示自己还是想了一段儿时间的。
总结起来,这次课设还是比较顺利的,因为自己想实现的东西基本还能不错的实现,虽然有时候一些东西找起来费了不少的时间。
做课设做的慢,很大一部分的原因是因为对编程语言的不熟悉,所以以后有时间的话应该尽量熟练掌握一门编程语言。
还有,编程的时候有时会出现一些很小的问题,就是因为用的少的原因。
总之,对于这次的课设,经过了自己一次一次的加工和修改,自己比较满意,同时,这次课设也让自己对最低松弛度优先算法有了更进一步的了解,程序还是有可以改进的地方,比如就绪队列中只有一个进程时,不需要计算松弛度,希望自己以后继续努力。
八、参考文献
[1]汤子瀛编著,计算机操作系统(修订版),西安电子科技大学出版社,2001年
[2]郑宇军编著,C#面向对象程序设计,人民邮电出版社,2009年
[3]梁红兵汤小丹编著,《计算机操作系统》学习指导与题解,西安电子科技大学出版社,2008年
[4]最低松弛度优先调度算法:
[5]pdf:
C#入门到精通
九、课程设计评价
课程设计评价
成绩:
教师:
年月日