采用最低松弛度优先调度的实时系统调度程序Word文档格式.docx
- 文档编号:16508206
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:22
- 大小:437.85KB
采用最低松弛度优先调度的实时系统调度程序Word文档格式.docx
《采用最低松弛度优先调度的实时系统调度程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《采用最低松弛度优先调度的实时系统调度程序Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
输入信息为任务总数,仿真时间,各任务编号,周期时间,和运行时间。
输出信息为各任务的开始时间,结束时间,运行次数,当前状态,任务当前松弛度,以及当前任务还需运行时间。
(2)行为:
系统通过调用,动态显示各个实时任务的最低松弛度。
当某个实时任务的最低松地度=0的时候,则抢占执行。
当多个实时任务的最低松弛度各不相等时,则予以该实时任务正常执行,而无需抢占。
当多个实时任务的最低松弛度相等时,则采用先来先服务的方式执行。
执行结果动态的显示在各个表格中,清楚的展现接下来该调度哪个实时任务,等待调度的实时任务有哪些和完成目前周期的实时任务有哪些。
(3)表示:
程序运行期间的显示布局如下图所示:
选择数据输入方式,包括文件读取和界面输入
界面键入总任务信息和各任务详细信息
控制按钮,包括开始,结束,暂停,终止,退出
系统信息(当前时间)和提示上下文切换
动态显示运行过程,包拾就绪,完成,执行
2、系统设计:
概要设计:
(1)输入模块:
用户处方选择文件读取和界面输入,文件读取仅要求用户选定相关文件,前提是编程者事先存储符合要求的信息。
界面输入要求用户输入正确的总任务信息和各个任务的详细信息,系统也将检查信息的合法性才予以调度。
(2)算法模块:
调度算法模块主要设计出根据最低松弛度进行调度的算法,以及予以任务抢占时的条件和调度过程
(3)输出模块:
用列表控件动态显示各个任务的就绪,执行,完成列表的属性信息。
(4)任务合法性检查模块:
检查提交给系统的任务的周期时间和运行时河是否都人于0,以及周期时间是否都大于运行时间
(5)可调度性检查模块:
检查提交给系统的所有任务是否满足可调度性公式。
(6)运行控制模块:
程序运行时的功能选择和相关控制功能。
2.1、模块设计:
在该系统中,由用户提交给系统总任务信息和各任务的信息,系统将就此检查各任务的合法性,合法则显示在就绪队列,再检查所有任务的可调度性,若可调度则进行演示。
演示的结果将动态显示在就绪,执行,完成的三个列表控件上。
模块调用关系图:
2・人数据结构说明:
typedefstruetQNode
{
P0INT_workdata;
struetQNode*next;
}QNode,*POINT_QNode;
typedefstruet{
POINT.QNodefront;
1、每一个任务对应一个work类型的结构体变量typedefstructwork
CString
job_id;
//任务的ID,唯一标志一个任务
int
job_beginTime;
〃任务的开始时间
job.llf;
〃任务当前低松弛度
job_state;
/任务当前状态
job_period;
〃任务的周期
job_runTime;
〃任务的运行时间
job_RneedTime;
〃任务完成还需的运行时间
job_endTime;
〃任务的结束时间
job_flag;
〃本周期内首次运行标识
job_doneTimes;
〃任务的执行次数
job_identify;
//任务是否完成的标识
job_MissTimes;
//任务错过次数
struet
work*next;
〃指向结构体变量work的指针
}work,*P0INT_work;
2、由任务排成的队列
//指向结构体类型数据的数据项指针
//指向下一个队列元素的指针
//任务队列的对头指针
〃任务队列队尾指针
POINT.QNoderear;
}Queue;
QueueQon,Qready,Qdone;
//定义三个队列,其中Qon表示正在执行的队列,该队列最多只有一个队列元素,
Qready表示就绪的队列,Qdone表示已经执行完成的队列
程序中用到的对上述数据结构的一些操作:
intInitQueue(Queue&
Q)
//构造空队列,成功返回1,否则返回0
voidOrderJob(Queue&
Q,P0INT_workjob)
//按照低松地度对进入队列的任务进行排序
intDeleteHead(Queue&
//若队列不空,则删除Q的头元素,用job保存,操作成功返回1,否则返回0
voidDestroyQueue(Queue&
Q)//销毁一个队列
intQueueEmpty(QueueQ)
〃判断队列是否为空若为空则返回1,否则返回0
intGetHeadElem(QueueQ,P0INT_workjob)
//取队列的第一个元素的值,成功返回1,否则返回0
intDeleteDefineQu己ue(Queu己&
Q,CStringstr,P0INT_workjob)
〃删除指定任务编号的队列节点,用结构体变量job保存,操作成功返回1,否则返回0
2.3、算法流程图:
(1)控制函数流程图:
开始
(2)检查函数流程图:
(3)调度函数流程图:
(4)输入函数流程图:
4.系统测试与调试分析
K系统测试
•测试方法:
黑盒
•测试技术:
单元测试、功能测试、
•测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
1、验证提交任务的可调度性
测
测试名称
采用最低松地度优先调度的实时系统调度程序
试说明
测试目的
验证提交任务的可调度性
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
通过文件读取的方式提交一批任务,测试系统对任务可调度性的判断
测试步骤
输入可调度的一批任务
输入不可调度任务
输入含非法任务
测试数据
任务数目:
3任务编号NO.1周期时间20s运行时间4s任务编号NO.2周期时间30s运行时间6s任务编号NO.3周期时间45s运行时间8s
3任务编号NO.1周期时间20s运行时间4s任务编号NO.2周期时间20s运行时间6s任务编号NO.3周期时间5s运行时间3s
3任务编号NO.1周期时间20s运行时间4s任务编号NO.2周期时间20s运行时间6s任务编号NO.3周期时间5s运行时间8s
预期结果
任务可调度,在就绪队列中排队
显示任务不可调度
提示含有非法任务
测试结果
与预期相符
2、验证任务调度顺序的正确性
测试说明
任务调度顺序的正确性验证
通过文件读取的方式提交一批任务,验证对任务的调度是否正确
任务总数:
3仿真时间100s任务编号NO.1周期时间20s运行时间6s任务编号NO.2周期时间10s运行时间4s
任务编号NO.3周期时间5s运行时间Is
调度程序先执行NO.3任务Is,然后执行NO.2任务4s,最后执行NO.1任务6s
3、验证当两个任务松弛度同时减为0时的执行结果
验证两个任务松地度同时减为0时的执行结果是否正确
功能测试
通过文件读取的方式提交一批任务,其中同时有两个任务的松弛度减为0
输入可上述任务
3仿真时间100s任务编号NO.1周期时间10s运行时间Is任务编号NO.2周期时间10s运行时间Is
任务编号NO.3周期时间18s运行时间10s
调度程序先执行NO.3任务9s,后执行NO.1任务Is,任务NO.2被错过
2、调试分析:
在程序的调试中,遇到了如下的问题:
1•在程序读取文件的任务信息时,无法读入仿真时间,OnRadiol()在该按钮中的函数中一步步用MessageBox输出每一步读取的参数信息的值,发觉每一步的输出没有问题,最终发觉,在OnshumO将全局变量SumTune又定义了一遍,在此函数中相当于局部变量在使用,因此无法传参。
最终删掉该定义,而直接使用,运行成功。
2.在程序的最后性能测试中,如果程序接收到任务队列,运行一段时间的后,有两个任务的松她度同时减为零了,程序就会运行出错,到后来发现了程序出现这个问题的原因,就是程序始终是在选取松弛度最小的任务调入运行队列,当遇到两个松弛度同时为0的任务时,程序就不知道怎么调用了。
后来我在算法中添加了先来先服务的调度算法来辅助实现,当出现上述情况时就先调入第一个任务,然后将第二个任务的松弛度=1000,在将其压入就绪队列中。
这样第二个任务就被错过一次,在卞个周期中,自动更新该任务的最低松弛度,然后重新参与任务的调度,具体参照Show_QreadyQ和Job_QiangdiaoQ
五、用户手册
1、本程序的开发平台是VC6.0,无需下载。
2、本程序的运行无需任何安装。
3、运行程序:
(1)在工程中找到最低松弛度优先・exe的文件双击开始运行程序。
图1程序运行的初始界面
2)在选项栏的“选择数据输入方式”中选择文件读取选项,弹出选择文件的对话框,选定要运行的文件后点击确定即可。
界面键入
图2点击界面输入按键后,选定文件
(3)如果选定文件的数据中含有运行周期小于运行时间的非法任务,系统会通过弹出MessageBox的方式提示用户输入错误。
单任务信息
就绪队列:
图3输入含有非法任务
(4)若用户输入的任务中不含有非法任务,此时系统会先将任务放入就绪队列中,然后调用可调度性检测函数来判断该批任务是否可以调度,若不可调度则提示用户,并将就绪队列记录清空,再初始化Qieadyo
仿真时间:
任务总数:
就绪B人列:
图4输入任务不可调度
(5)若输入任务可以调度,系统不会给出任何提示,可直接在就绪队列的列表中显示就绪队列的各任务信息
任务名|状态|剩余时间I周期时间I需要时间
任务名
|状态
[周期时间
丁处理阿间
|最低松弛度
I剩余时间
N0.3
就绪
5
1
4
NO.2
10
6
N0.1
20
14
完成队列:
任务名丨状态I幵始时间I结束时间I运行次数
图5输入正确的任务信息,检查就绪队列
(6)点击开始运行按键即开始任务调度的模拟,三个动态显示控件分别用来显示运行任务,就绪队列和完成队列里面各任务的属性信息,上卞文切换时,提示用户按下任意键继续。
[状态
剩余时间
周期时间
需要时间
110.1
执行
就绪P人列:
状态
处理时间
最低松弛度
完成队列;
任势名I状态I开始时间I结束时间I运行次数
iro.3完成672
K0.2完成591
图6动态显示任务的调度过程
(7)
a畀面输入
若选择从当前的界面输入时,系统会在用户输入运行任务总数和运行时间后,隐藏和锁定这两个按键,从而不再接受关于这两个变量的任何输入。
之后用户只可依次输入任务的信息,非法的输入数据在输入时将会被自动忽略,以及对任务编号是否重名的检查。
当任务输入完成时,隐藏“点击提交本次任务”。
选搔数据箱入方式:
叵
仿真时间:
[Too
任务编号:
p运行时间:
[I周期时间:
点击提玄本次任势
图7用户从界面输入任务信息
(8)在运行过程中点击暂停运行\继续运行\终止运行按键依次实现程序运行的暂停运行、继续运行、和退出当前任务运行的功能。
当用户点击暂停时,就算没有上下文切换,系统的运行也会停下来,直到用户点击继续。
动态显示:
开始运行1
继续运行
终止运行|谡出系统|
机行从列:
已仿真时间:
任劳名
1状态剩余时间
周期时间1需要时间
HO.1执行42010
丨状态
50
25
19
完序队列:
任务名丨状态
〔开始时间
结束时间—I迄行炎数
图8运行过程中暂停
六、程序清单
//文件读取
voidCMvDlg:
:
OiiRadio1Q
//TODO:
Addyouicontiolnotificationhandlercodehere
CStrings1,s2jiame.periodd-untmie,stuTmiey/^时|uj
mtsum^job;
//限定文件格式
CFileDialogdlg(true,NULL、NULLQFN_HIDEREADONLY|OFN_OVERWRITEPROM
PT:
rtextfiles|*.txt||n);
if(IDOK==dlg.DoModal0)//正常打开
s1=dlg.GetPatliNaine();
//获取文件路径
}
CStdioFilefile;
//C运行时流式文件
if(!
file.Open(s1,CFile:
:
modeRead))//只读的方式打开失败,参数:
获取路径,打开方式
Mess昭eEox(”文件打开失败”);
return;
file.ReadStrmg(s2);
//开始文件第一行,总任务数
sum」ob=atoi(s2);
〃转换为整数
file.ReadStrmg(stuTiine);
〃仿真时间
SumTiine=atoi(stuTime);
legal=0;
i=0;
i<
sum_job;
i++)
file.ReadStrmg(name);
file.ReadStrmg(period);
file.ReadStrmg(nintmie)y/完全读取文件中一个任务的信息
CMyDlg:
DuQu(name,period,luntiiiie);
if(legaP=0)
{//含有错误文件内容
KiUTuner(l);
Destio\TQueue(Qon);
Destio\TQueue(Qready);
DestioyrQueue(Qdone);
mjistl.DeleteAllItemsQ;
m_list2.DeleteAllItemsQ;
m_list3.DeleteAllItemsQ;
count=0;
//系统时间
GetDlgItem(IDC_sho\vrtiine)->
SetWmdowText(nH);
IintQueue(Qon);
IiiitQueue(Qdone);
IintQueue(Qready);
112=O;
//112启动定时器的标识
n=0;
///若ii为0,则从就绪队列中取出一个满足要求的作业运行return;
CMvDlg:
DiaoDuQ;
//读取任务信息
mtCMyDlg:
DuQu(CStiiiigsi,CStiiiigs2,CStrings3){
intij;
i=atoi(s2);
j=atoi(s3);
if(i<
=O|[j<
=O||i<
j){
legal-H-;
Mess昭eEox(”输入任务为非法,请重新输入”);
return0;
else{
POINT_wo】kjob;
job=new(work);
job->
job_begmTiine=0;
job_doneTuiies=0;
job->
job_flag=0;
job_id=sl;
job_identify=0;
job->
job_llf=ij;
job_MissTmies=0;
job_penod=i;
job_RiieedTmie=j;
job_RinTiine=j;
job_state=n就绪,:
if(SaineFileName(Qreadyjob))
{〃若没有重名
OrderJob(Qieady.job)〃进入的作业,按照最低松弛度进行排序CMvDlg:
Show_Qieady();
//i$取成功,作业显示在就绪队列return1;
else
MessageBox(Htf务编号有重名,请重新输入!
”);
//任务调度性检查
DiaoDuQ
floatjudge=0.0;
i罠!
QueueEmpty(Qready)){
POINT.QNodep;
p=Qready.fiont->
next;
\vhile(p){judge=judge+(float)p->
data->
job_RinTiine/(float)p->
job_penod;
p=p->
if(judge>
1.0){
MessageBox("
输入不符合要求,不可调度!
Destio\TQueue(Qieadv);
InitQueue(Qready);
return0;
elseleturn1;
elsereturn0;
//正在执行的作业在正常结束的情况下作业切换
Job_Diao()
POINT.workjob;
QueueEmpty(Qon)){//将已完成的任务投入完成队列
DeleteHead(Qonjob);
job_identify=l;
job_doneTunes-H-;
jobJlf=(job->
job_doneTimes+l)*job->
job_penod-countjob->
job_ruiiTmie;
job_state="
完成”;
job_endTune=count;
GetFnstPosition(Qdone,job);
〃放入完成队列的首位置
}if((job->
job_MissTimes+job->
job_doneTimes)*job->
job_period==nit(count)){//完成队列的任务进入下一周期,需投入到就绪队列
DeleteHead(Qdonejob);
job_llf=(job->
job_MissTmies-Fjob->
job_doneTmies+l)*job->
job_penod-countjob->
job_RinTiine;
job_state='
*就绪”;
OrderJob1(Qieadyjob);
QueueEmpty(Qready)){//就绪队列不空,取队头任务
DeleteHead(Qreadvjob);
job_state=n执行蔦
OrderJob(Qonjob);
left_Tune=job->
job_RiieedTmie;
return1;
//实现抢占时作业的上下文切换
Job_Qiangdiao()
POINT_woikjob;
QueueEmpty(Qon))
{//若队列不为空,则取出已经运行过的作业,再投入就绪队列等待
DeleteHead(Qon.job);
job_doneTimes+l)*(job->
job_period)-count-job->
job_RneedTmie;
job_state=H就绪”;
job_flag=l;
OrderJob(Qreadyjob);
QueueEmpty(Qready))
{//若就绪队列不空,则取出队头作业运行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 采用 最低 松弛 优先 调度 实时 系统 程序