采用最低松弛度优先调度的实时系统调度程序.docx
- 文档编号:3603264
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:22
- 大小:437.85KB
采用最低松弛度优先调度的实时系统调度程序.docx
《采用最低松弛度优先调度的实时系统调度程序.docx》由会员分享,可在线阅读,更多相关《采用最低松弛度优先调度的实时系统调度程序.docx(22页珍藏版)》请在冰豆网上搜索。
采用最低松弛度优先调度的实时系统调度程序
操作系统课程设计报告
院(系):
计算机工程学院
专业:
网络工程
学生姓名:
班级:
学号:
题目:
采川最低松弛度优先调度的实时系统调度程序
起迄日期:
…一
指导教师:
2012—2013年度第2学期
完成日期:
2013年7月19日
课程设计目的
由于在实时系统中都存在着若干个实时进程或任务,它们用来反应或控制某个外部事件,往往带有某种程序的紧迫性,因此采用一种新的调度:
实时调度才能实现合理合法的调度。
而最低松弛度优先,是一种抢占式的实时调度,根据任务的松地程度来确定任务的优先级。
任务的松地度愈低,愈优先执行。
通过实现利用最低松弛度对作业进行调度的模拟,我可以清楚的了解操作系统的相关任务调度原理和操作系统的任务调度过程。
此次的课程设计让我对该调度算法有了更加深入的理解同时对以编程实现该算法和可视化编程有了更深一步的了解和巩固。
二、课程设计内容与要求
1、在实时系统中,要保证在指定的时间完成指定的任务,通常会采用抢占式的调度方式。
要求采用指定的调度算法,使系统中的任务能够按时完成,通过观察中系统中的抢占点,以巩固和加深对实时系统调度算法的理解。
2、设计要求:
1)每一个周期性实时任务必须指定周期长度与执行时间。
2)可以在界面安排周期性实时任务的个数与相关的指标值,又及要求仿真的时间长度。
3)系统可又对设定的任务条件进行检查,如果无法满足公式十的要求,则弹
出相应的错误提示,并重新进入任务安排界面。
占”一
4)可读取样例数据(要求存放在外部文件中)进行周期性实时后务'数、周期长度、执行时间的初始化。
5)采用可视化界面,数据载入后按最低松弛度算法进行调度,可以在运行中动态显示各进程的状态:
就绪、执行、完成。
6)系统上下文切换时,会暂停调度,显示就绪队列中各任务的松弛度,按任意键后自动运行。
7)具有一定的数据容错性。
三、系统分析与设计
1、系统分析
在系统中,通过界面输入或文件读取来向系统录入数据,由输入各个任务的相关信息来计算出最低松弛度。
对于每一个任务,当最低松弛度减小到零时便开始抢占处理机,对于多个任务最低松弛度相同的情况下,采用先来先服务的辅助调度算法。
最后动态显示运行的实时结果,从而直观的表现出采用最低松弛度调度算法的工作原理和调度过程。
(1)信息:
输入信息为任务总数,仿真时间,各任务编号,周期时间,和运行时间。
输出信息为各任务的开始时间,结束时间,运行次数,当前状态,任务当前松弛度,以及当前任务还需运行时间。
(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;
〃任务的开始时间
int
job.llf;
〃任务当前低松弛度
CString
job_state;
/任务当前状态
int
job_period;
〃任务的周期
int
job_runTime;
〃任务的运行时间
int
job_RneedTime;
〃任务完成还需的运行时间
int
job_endTime;
〃任务的结束时间
int
job_flag;
〃本周期内首次运行标识
int
job_doneTimes;
〃任务的执行次数
int
job_identify;
//任务是否完成的标识
int
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,P0INT_workjob)
//若队列不空,则删除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
1
NO.2
就绪
10
4
6
4
N0.1
20
6
14
6
完成队列:
任务名丨状态I幵始时间I结束时间I运行次数
图5输入正确的任务信息,检查就绪队列
(6)点击开始运行按键即开始任务调度的模拟,三个动态显示控件分别用来显示运行任务,就绪队列和完成队列里面各任务的属性信息,上卞文切换时,提示用户按下任意键继续。
任务名
[状态
剩余时间
周期时间
需要时间
110.1
执行
6
20
6
就绪P人列:
状态
周期时间
处理时间
最低松弛度
剩余时间
完成队列;
任势名I状态I开始时间I结束时间I运行次数
iro.3完成672
K0.2完成591
图6动态显示任务的调度过程
(7)
a畀面输入
若选择从当前的界面输入时,系统会在用户输入运行任务总数和运行时间后,隐藏和锁定这两个按键,从而不再接受关于这两个变量的任何输入。
之后用户只可依次输入任务的信息,非法的输入数据在输入时将会被自动忽略,以及对任务编号是否重名的检查。
当任务输入完成时,隐藏“点击提交本次任务”。
选搔数据箱入方式:
界面键入
任务总数:
叵
仿真时间:
[Too
单任务信息
任务编号:
p运行时间:
[I周期时间:
点击提玄本次任势
图7用户从界面输入任务信息
(8)在运行过程中点击暂停运行\继续运行\终止运行按键依次实现程序运行的暂停运行、继续运行、和退出当前任务运行的功能。
当用户点击暂停时,就算没有上下文切换,系统的运行也会停下来,直到用户点击继续。
动态显示:
开始运行1
继续运行
终止运行|谡出系统|
机行从列:
已仿真时间:
6
任劳名
1状态剩余时间
周期时间1需要时间
HO.1执行42010
任务名
丨状态
周期时间
处理时间
最低松弛度
剩余时间
NO.2
就绪
50
25
19
25
完序队列:
任务名丨状态
〔开始时间
结束时间—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 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 legal-H-; Mess昭eEox(”输入任务为非法,请重新输入”);return0; } else{ POINT_wo】kjob; job=new(work); job->job_begmTiine=0; job->job_doneTuiies=0; job->job_flag=0; job->job_id=sl; job->job_identify=0;job->job_llf=ij;job->job_MissTmies=0;job->job_penod=i; job->job_RiieedTmie=j; job->job_RinTiine=j; job->job_state=n就绪,: if(SaineFileName(Qreadyjob)) {〃若没有重名 OrderJob(Qieady.job)〃进入的作业,按照最低松弛度进行排序CMvDlg: : Show_Qieady();//i$取成功,作业显示在就绪队列return1; else MessageBox(Htf务编号有重名,请重新输入! ”);return0; //任务调度性检查 mtCMyDlg: : DiaoDuQ floatjudge=0.0; i罠! QueueEmpty(Qready)){ POINT.QNodep; p=Qready.fiont->next; \vhile(p){judge=judge+(float)p->data->job_RinTiine/(float)p->data->job_penod;p=p->next; if(judge>1.0){ MessageBox("输入不符合要求,不可调度! ”);Destio\TQueue(Qieadv); InitQueue(Qready); m_list2.DeleteAllItemsQ; return0; } elseleturn1; } elsereturn0; //正在执行的作业在正常结束的情况下作业切换 mtCMyDlg: : Job_Diao() { POINT.workjob; job=new(work); if(! QueueEmpty(Qon)){//将已完成的任务投入完成队列 DeleteHead(Qonjob); job->job_flag=0; job->job_identify=l; job->job_doneTunes-H-; job->jobJlf=(job->job_doneTimes+l)*job->job_penod-countjob->job_ruiiTmie; job->job_state="完成”;job->job_endTune=count; GetFnstPosition(Qdone,job);〃放入完成队列的首位置 }if((job->job_MissTimes+job->job_doneTimes)*job->job_period==nit(count)){//完成队列的任务进入下一周期,需投入到就绪队列 DeleteHead(Qdonejob); job->job_llf=(job->job_MissTmies-Fjob->job_doneTmies+l)*job->job_penod-countjob->job_RinTiine; job->job_state='*就绪”; OrderJob1(Qieadyjob); } if(! QueueEmpty(Qready)){//就绪队列不空,取队头任务 DeleteHead(Qreadvjob); job->job_state=n执行蔦 OrderJob(Qonjob); left_Tune=job->job_RiieedTmie; } return1; } //实现抢占时作业的上下文切换 mtCMyDlg: : Job_Qiangdiao() { POINT_woikjob; job=new(work); i罠! QueueEmpty(Qon)) {//若队列不为空,则取出已经运行过的作业,再投入就绪队列等待 DeleteHead(Qon.job); job->job_llf=(job->job_MissTimes+job->job_doneTimes+l)*(job->job_period)-count-job->job_RneedTmie; job->job_state=H就绪”; job->job_flag=l; job->job_identify=0; OrderJob(Qreadyjob); } if(! QueueEmpty(Qready)) {//若就绪队列不空,则取出队头作业运行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 采用 最低 松弛 优先 调度 实时 系统 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)