系统软件开发实训课程设计_第1页
系统软件开发实训课程设计_第2页
系统软件开发实训课程设计_第3页
系统软件开发实训课程设计_第4页
系统软件开发实训课程设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-3"\h\u11691.课程设计目的与功能 3285452.需求分析与模块说明 3157342.1需求分析 3161842.1.1功能需求 3284822.1.2环境需求 457972.1.3用户界面需求 4132222.2模块说明 5138513.源程序的主要部分 5106283.1数据结构 524013.2主要函数 7317914.测试用例,运行结果与运行情况分析 10272654.1测试用例 1044884.2运行结果分析 12132925.自我评价与总结 126.附录131.课程设计目的与功能模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。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信息1:先来先服务进程1信息1:先来先服务输入进程数输入进程数进程2信息开始进程2信息开始2:最高响应比2:最高响应比进程n信息进程n信息3:退出程序3:退出程序首先选择调度算法,若选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<pronum;i++) { p2=p1; p1=newPCB; p1->next=NULL; cout<<"请依次输入第"<<i+1<<"个进程的信息(进程名、到达时间、估计运行时间):"; cin>>p1->name>>p1->ta>>p1->ts; p1->tm=p1->ts; p1->rn=1; p2->next=p1; } returnhead;}3.2主要函数structPCB{};//进程结构#defineMAX_NUM15PCB*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->name; p=p->next; } cout<<endl; cout<<"进程名提交时间开始时间结束时间周转时间带权周转时间\n";s=head->next; while(s!=NULL) { cout<<setw(4)<<s->name<<setw(7)<<s->ta<<setw(10)<<s->tb<<setw(11)<<s->to<<setw(10)<<s->totalTime<<setw(10)<<s->weightTotalTime<<endl; s=s->next; } cout<<endl;cout<<"平均周转时间:"<<total/(double)pronum<<endl; cout<<"平均带权周转时间:"<<weight/(double)pronum<<endl; cout<<"******************************************************"<<endl; 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<MAX_NUM;ss++) pname[ss]=""; sort(head); cout<<endl; cout<<"顺序进程名提交时间开始时间结束时间周转时间带权周转时间\n"; head=head->next; p=head; while(head) { q=head; if(time<p->ta)//如果该进程提交时间早于其它进程,则先执行该进程 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<flag->ta)//如果上一次结束时间比当前选中要执行进程的结束时间小 time=flag->ta;//则当前进程开始时间为提交时间 //输出当前执行进程的信息cout<<setw(4)<<xuhao+1; cout<<setw(8)<<flag->name; cout<<setw(8)<<flag->ta; cout<<setw(8)<<time; cout<<setw(10)<<(time+flag->ts); cout<<setw(10)<<(time-flag->ta+flag->ts); cout<<""<<setw(11)<<(double)((time-flag->ta+flag->ts)/flag->ts)<<endl; 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<n;ss++) { cout<<pname[ss]; if(pname[ss+1]!="") cout<<"->"; } cout<<endl; cout<<"平均周转时间为:"<<runTime/n<<endl;cout<<"平均带权周转时间为:"<<drunTime/n<<endl; cout<<"******************************************************"<<endl;}4.测试用例,运行结果与运行情况分析4.1测试用例(1)先来先服务算法(2)响应比优先算法输入错误4.2运行结果分析对以上测试用例进行分析,用这两种调度算法所得的进程执行顺序正确,其平均周转时间和平均带权周转时间也是正确。由此可得出该程序的正确性和可行性。5.自我评价与总结这次课程设计是让我们用已经学过的操作系统知识对先来先服务算法和最高响应比算法进行设计,使我在对进程调度的先来先服务和最高响应比优先算法充分理解的同时,也使我的实践编程能力和运用理论知识的能力得到进一步提高。在此次实验中,我认为我比较出色的是自己一开始就有了一个整体的思路,不像以前的课程设计一样,对全局的规划不是很清楚,以至于在后来模块的衔接做得不到位,但是此次的设计由于初始就对各个功能块的相互调用也比较了解,所以对该课设的设计整体上比较轻松,也使程序的编写比较清晰。不过,在此次课设中我也出现了不少问题,尤其是在对先来先服务和最高响应比优先功能块的设计时,对其中每个进程之间的时间比较和响应比比较的具体代码还比较模糊,因此使得设计一度陷入了修改和编写中;此外,刚开始对程序的容错能力并未加入考虑的范围,所以使得程序的完整性和健壮性比较欠缺。所以,从中看出自己在具体细致的地方还约显不足,还有待提高。通过此次课程设计,也使我见到对同一实验目的可以使用多种方法,C++的编程比较符合我们现在的编程设计能力,但是使用JAVA也可以完成相同功能,而且会使得某些步骤还比较简易。此外,使程序具有较强的容错能力也对程序设计的优劣性起到较为重要的因素。相信通过这次的设计,对我以后的学习和编程能力有一定的帮助。附录:程序源代码#include<iostream>#include<string>#include<iomanip>usingnamespacestd;structPCB{ stringname;//进程名 floatta;//进程到达时间 floatts;//进程估计运行的时间 floattb;//进程开始运行时间 floattm;//进程仍需运行的时间 floatto;//进程完成的时间 floattotalTime;//周转时间 floatweightTotalTime;//带权周转时间(周转时间/估计运行时间) PCB*next;//定义指向下一个进程的指针};#defineMAX_NUM15intpronum;//定义进程数为pronumfloattotal;//记录所有进程的总时间floatweight;//记录所有进程的带权周转时间PCB*create(PCB*head);//创建进程队列voiddeal(PCB*head);//FCFS记录处理voidsort(PCB*head);//将进程按到达的先后顺序排列voidfcfsrun(PCB*head);//先来先服务算法voidHrn(PCB*head,intn);//最高响应比算法voidmain(){ intchoice; cout<<"*进程调度模拟设计--先来先服务、最高响应比优先算法*"<<endl; cout<<"***********1.先来先服务算法***************************"<<endl; cout<<"***********2.最高响应比优先算法*********************"<<endl; cout<<"***********3退出*************************************"<<endl;l1: cout<<"请输入您的选择:"<<endl; 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请重新输入:"<<endl;gotol1; }}PCB*create(PCB*head){ PCB*p1,*p2; p1=p2=newPCB; head=p1; cout<<"请输入进程数:"; cin>>pronum; for(inti=0;i<pronum;i++) { p2=p1; p1=newPCB; p1->next=NULL; cout<<"请依次输入第"<<i+1<<"个进程的信息(进程名、到达时间、估计运行时间):"; 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->name; p=p->next; } cout<<endl; cout<<"进程名提交时间开始时间结束时间周转时间带权周转时间\n";s=head->next; while(s!=NULL) { cout<<setw(4)<<s->name<<setw(7)<<s->ta<<setw(10)<<s->tb<<setw(11)<<s->to<<setw(10)<<s->totalTime<<setw(10)<<s->weightTotalTime<<endl; s=s->next; } cout<<endl;cout<<"平均周转时间:"<<total/pronum<<endl; cout<<"平均带权周转时间:"<<weight/pronum<<endl; cout<<"******************************************************"<<endl; 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<MAX_NUM;ss++) pname[ss]="";//置空 sort(head); cout<<endl; cout<<"顺序进程名提交时间开始时间结束时间周转时间带权周转时间\n"; head=head->next; p=head; while(head) { q=head; if(time<p->ta)//如果该进程提交时间早于其它进程,则先执行该进程 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<flag->ta)//如果上一次结束时间比当前选中要执行进程的结束时间小 time=flag->ta;//则当前进程开始时间为到达时间 //输出当前执行进程的信息cout<<setw(4)<<xuhao+1; cout<<setw(8)<<flag->name; cout<<setw(8)<<flag->ta; cout<<setw(8)<<time; cout<<setw(10)<<(time+flag->ts); cout<<setw(10)<<(time-flag->ta+flag->ts); cout<<""<<setw(11)<<((time-fla

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论