系统软件开发实训课程设计.docx
- 文档编号:25540635
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:25
- 大小:219.94KB
系统软件开发实训课程设计.docx
《系统软件开发实训课程设计.docx》由会员分享,可在线阅读,更多相关《系统软件开发实训课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
系统软件开发实训课程设计
课程设计任务书
学生姓名:
闫敏专业班级:
计科1103班
指导教师:
蔡菁工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——先来先服务、最高响应比优先调度算法初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结。
时间安排:
设计安排3周:
查阅、分析资料1天
系统软件的分析与建模4天
系统软件的设计5天
系统软件的实现3天
撰写文档1天
课程设计验收答辩1天
设计验收安排:
设计周的第三周的指定时间到实验室进行上机验收。
设计报告书收取时间:
课程设计验收答辩完结时。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
2013年12月10日
系主任(或责任教师)签名:
2013年12月10日
目录
1.课程设计目的与功能3
2.需求分析与模块说明3
2.1需求分析3
2.1.1功能需求3
2.1.2环境需求4
2.1.3用户界面需求4
2.2模块说明5
3.源程序的主要部分5
3.1数据结构5
3.2主要函数7
4.测试用例,运行结果与运行情况分析10
4.1测试用例10
4.2运行结果分析12
5.自我评价与总结12
6.附录.....................................................................................................13
1.课程设计目的与功能
模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.需求分析与模块说明
2.1需求分析
2.1.1功能需求
(1)实现先来先服务法:
先来先服务算法基本思想:
按照作业提交或进程变为就绪状态的先后次序,调入系统或分派CPU,换句话说,调度程序每次选择的作业进程是等待时间最久的,而不管其运行时间的长短。
这种调度算法突出的优点是实现简单,效率较低,在一些实际的系统和一般应用程序中采用这种算法的较多。
因此,在设计中,首先对输入的各进程的提交时间进行比较,对先进入等待队列的进程提供服务。
(2)实现最高响应比优先调度算法:
最高响应比优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R定义如下:
R=(W+T)/T=1+W/T
其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。
每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。
这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。
这种算法是介于FCFS和SJF之间的一种折中算法。
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
2.1.2环境需求
开发环境、运行环境及开发语言:
开发环境:
Windows平台+VisualC++6.0
运行环境:
Windows全系列平台
开发语言:
C++
2.1.3用户界面需求
输入输出均采用命令行界面,格式如下:
首先,输入进程数;其次,输入进程编号、进程名、到达时间、执行时间等相关信息;然后,选择算法,先来先服务算法或最高响应比算法;最后,输出程序运行所得结果。
2.2模块说明
程序流程图如下:
首先选择调度算法,若选1先来先服务然则调用create()创建进程队列,然后调用fcfsrun()进行先来先服务算法,后Goto到起始点。
若选择2最高响应比算法则调用create()创建进程队列,然后调用Hrn()进行最高响应比算法,后Goto到起始点。
若选择3则退出,选择其他则报错。
3.源程序的主要部分
3.1数据结构
创建一个进程信息结构:
structPCB
{
stringname;//进程名
floatta;//进程到达时间
floatts;//进程估计运行的时间
floattb;//进程开始运行时间
floattm;//进程仍需运行的时间
floatto;//进程完成的时间
floatrn;//进程运行的次数
floattotalTime;//周转时间
doubleweightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB*next;//定义指向下一个进程的指针
};
此外,对输入信息进行创建链表队列:
PCB*create(PCB*head)
{
PCB*p1,*p2;
p1=p2=newPCB;
head=p1;
cout<<"请输入进程数:
";
cin>>pronum;
for(inti=0;i { p2=p1; p1=newPCB; p1->next=NULL; cout<<"请依次输入第"< "; cin>>p1->name>>p1->ta>>p1->ts; p1->tm=p1->ts; p1->rn=1; p2->next=p1; } returnhead; } 3.2主要函数 structPCB{};//进程结构 #defineMAX_NUM15 PCB*create(PCB*head);//创建进程队列 voiddeal(PCB*head);//FCFS记录处理 voidsort(PCB*head);//将进程按到达的先后顺序排列 voidfcfsrun(PCB*head);//先来先服务算法 voidHrn(PCB*head,intn);//最高响应比算法 voidmain(){}//主函数 其中先来先服务算法和最高响应比算法具体如下: voidfcfsrun(PCB*head)//先来先服务算法 { deal(head); PCB*p,*q,*s; p=head->next; cout<<"进程执行顺序为: "; while(p! =NULL) { cout<<"--"< p=p->next; } cout< cout<<"进程名提交时间开始时间结束时间周转时间带权周转时间\n"; s=head->next; while(s! =NULL) { cout< s=s->next; } cout< cout<<"平均周转时间: "< cout<<"平均带权周转时间: "< cout<<"******************************************************"< total=0; weight=0; } //最高响应比算法函数 voidHrn(PCB*head,intn) { PCB*p,*p1; PCB*flag=NULL; PCB*q=NULL; doubletime=0,j=0,runTime=0,drunTime=0; intxuhao=0; stringpname[MAX_NUM]; for(intss=0;ss pname[ss]=""; sort(head); cout< cout<<"顺序进程名提交时间开始时间结束时间周转时间带权周转时间\n"; head=head->next; p=head; while(head) { q=head; if(time time=p->ta; flag=head;//用于暂存将要执行的进程 //计算当前链表中进程的响应比 while(q&&q->ta<=time) { if((time-q->ta)/(q->ts)>(time-flag->ta)/(flag->ts)) flag=q; q=q->next; } if(time time=flag->ta;//则当前进程开始时间为提交时间 //输出当前执行进程的信息 cout< cout< cout< cout< cout< cout< cout<<""< j=(time-flag->ta+flag->ts);//当前执行进程的周转时间 runTime+=j;//记录周转时间 time+=flag->ts; drunTime+=j/flag->ts;//带权周转时间 pname[xuhao]=flag->name; xuhao++; //将执行过的进程从链表中删除 if(flag==head)//在链表头 head=head->next; else {//在链表中 p1=head; while(p1->next! =flag) p1=p1->next; p1->next=flag->next; deleteflag;//删除这个进程所占的节点 } } cout<<"进程执行顺序为: "; for(ss=0;ss { cout< if(pname[ss+1]! ="") cout<<"->"; } cout< cout<<"平均周转时间为: "< cout<<"平均带权周转时间为: "< cout<<"******************************************************"< } 4.测试用例,运行结果与运行情况分析 4.1测试用例 (1)先来先服务算法 (2)响应比优先算法 输入错误 4.2运行结果分析 对以上测试用例进行分析,用这两种调度算法所得的进程执行顺序正确,其平均周转时间和平均带权周转时间也是正确。 由此可得出该程序的正确性和可行性。 5.自我评价与总结 这次课程设计是让我们用已经学过的操作系统知识对先来先服务算法和最高响应比算法进行设计,使我在对进程调度的先来先服务和最高响应比优先算法充分理解的同时,也使我的实践编程能力和运用理论知识的能力得到进一步提高。 在此次实验中,我认为我比较出色的是自己一开始就有了一个整体的思路,不像以前的课程设计一样,对全局的规划不是很清楚,以至于在后来模块的衔接做得不到位,但是此次的设计由于初始就对各个功能块的相互调用也比较了解,所以对该课设的设计整体上比较轻松,也使程序的编写比较清晰。 不过,在此次课设中我也出现了不少问题,尤其是在对先来先服务和最高响应比优先功能块的设计时,对其中每个进程之间的时间比较和响应比比较的具体代码还比较模糊,因此使得设计一度陷入了修改和编写中;此外,刚开始对程序的容错能力并未加入考虑的范围,所以使得程序的完整性和健壮性比较欠缺。 所以,从中看出自己在具体细致的地方还约显不足,还有待提高。 通过此次课程设计,也使我见到对同一实验目的可以使用多种方法,C++的编程比较符合我们现在的编程设计能力,但是使用JAVA也可以完成相同功能,而且会使得某些步骤还比较简易。 此外,使程序具有较强的容错能力也对程序设计的优劣性起到较为重要的因素。 相信通过这次的设计,对我以后的学习和编程能力有一定的帮助。 附录: 程序源代码 #include #include #include usingnamespacestd; structPCB { stringname;//进程名 floatta;//进程到达时间 floatts;//进程估计运行的时间 floattb;//进程开始运行时间 floattm;//进程仍需运行的时间 floatto;//进程完成的时间 floattotalTime;//周转时间 floatweightTotalTime;//带权周转时间(周转时间/估计运行时间) PCB*next;//定义指向下一个进程的指针 }; #defineMAX_NUM15 intpronum;//定义进程数为pronum floattotal;//记录所有进程的总时间 floatweight;//记录所有进程的带权周转时间 PCB*create(PCB*head);//创建进程队列 voiddeal(PCB*head);//FCFS记录处理 voidsort(PCB*head);//将进程按到达的先后顺序排列 voidfcfsrun(PCB*head);//先来先服务算法 voidHrn(PCB*head,intn);//最高响应比算法 voidmain() { intchoice; cout<<"*进程调度模拟设计--先来先服务、最高响应比优先算法*"< cout<<"***********1.先来先服务算法***************************"< cout<<"***********2.最高响应比优先算法*********************"< cout<<"***********3退出*************************************"< l1: cout<<"请输入您的选择: "< cin>>choice; PCB*head=NULL;//? switch(choice) { case1: head=create(head);fcfsrun(head);gotol1; case2: head=create(head);Hrn(head,pronum);gotol1; case3: break; default: cout<<"输入错误! \n请重新输入: "< } } PCB*create(PCB*head) { PCB*p1,*p2; p1=p2=newPCB; head=p1; cout<<"请输入进程数: "; cin>>pronum; for(inti=0;i { p2=p1; p1=newPCB; p1->next=NULL; cout<<"请依次输入第"< "; cin>>p1->name>>p1->ta>>p1->ts; p1->tm=p1->ts; p2->next=p1; } returnhead; } voidsort(PCB*head)//将进程按到达的先后顺序排列 { PCB*p,*q,*r,*s; if(head->next! =NULL) { p=head->next->next; head->next->next=NULL; } while(p) { q=p; p=p->next; r=head; s=head->next; while(s&&s->ta<=q->ta) { r=s; s=s->next; } r->next=q; q->next=s; } } voiddeal(PCB*head)//FCFS记录处理 { sort(head); PCB*p,*q; q=head->next; q->tb=q->ta; q->to=q->tb+q->ts; q->totalTime=q->to-q->ta; q->weightTotalTime=q->totalTime/q->ts; total+=q->totalTime; weight+=q->weightTotalTime; p=q->next; while(p! =NULL) { p->tb=q->to; p->to=p->tb+p->ts; p->totalTime=p->to-p->ta; p->weightTotalTime=p->totalTime/p->ts; total+=p->totalTime; weight+=p->weightTotalTime; q=p; p=p->next; } } voidfcfsrun(PCB*head)//先来先服务算法 { deal(head); PCB*p,*q,*s; p=head->next; cout<<"进程执行顺序为: "; while(p! =NULL) { cout<<"--"< p=p->next; } cout< cout<<"进程名提交时间开始时间结束时间周转时间带权周转时间\n"; s=head->next; while(s! =NULL) { cout< s=s->next; } cout< cout<<"平均周转时间: "< cout<<"平均带权周转时间: "< cout<<"******************************************************"< total=0; weight=0; } //最高响应比算法函数 voidHrn(PCB*head,intn) { PCB*p,*p1; PCB*flag=NULL; PCB*q=NULL; floattime=0,j=0,runTime=0,drunTime=0; intxuhao=0; stringpname[MAX_NUM]; for(intss=0;ss pname[ss]="";//置空 sort(head); cout< cout<<"顺序进程名提交时间开始时间结束时间周转时间带权周转时间\n"; head=head->next; p=head; while(head) { q=head; if(time time=p->ta; flag=head;//用于暂存将要执行的进程 //计算当前链表中进程的响应比 while(q&&q->ta<=time) { if((time-q->ta)/(q->ts)>(time-flag->ta)/(flag->ts)) flag=q; q=q->next; } if(time time=flag->ta;//则当前进程开始时间为到达时间 //输出当前执行进程的信息 cout< cout< cout< cout< cout< cout< cout<<""< j=(time-flag->ta+flag->ts);//当前执行进程的周转时间 runTime+=j;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统软件 开发 课程设计