还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验一进程调度实验专业XXXXX学号XXXXX姓名XXX实验日期20XX年XX月XX日
一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解
二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度
三、实验方法内容
1.算法设计思路将每个进程抽象成一个控制块PCB,PCB用一个结构体描述构建一个进程调度类将进程调度的各种算法分装在一个类中类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程还有一个PCB实例主要保存正在运行的进程类中其他方法都是围绕这三个容器可以这个运行中的PCB展开主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、完成容器当程序启动时,用户可以选择不同的调度算法然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片判断进程容器中是否有新的进程可以加入就绪队列
2.算法流程图主程序的框架���文本框的高度和它所关联的边框线将随文本的增删而增减拖动侧边手柄可以更改注释宽度��开始�选择调度算法�voidFCFS;//先来先服务voidSJF;/�输入进程信息�将输入容器中以满足进入条件的进程调入就绪队列判断就绪容器和输入容器是否为空�!processScheduler.m_WaitQueue.empty||!processScheduler.m_ProcessQueue.empt�voidProcessQueueProcess;//查看当前时间下,有无进程加入若有则把该进程调入就绪队列voidPCBInput;//输入进程信息Y打印各进程信息�进行统计计算周转时间等�结束�voidPCBDisplay;//打印当前状况下就绪队列、完成队列、运行中的进程信息voidSchedulerStatistics;//调度统计,计算周转时间等按照选择的算法开始选择就绪队列的进程开始执行voidProcessSelect;//若当前就绪队列不为空则根据选择的调度算法开始调度否则,系统时间加一个时间片.以等待新的进程到进程调度过程���文本框的高度和它所关联的边框线将随文本的增删而增减拖动侧边手柄可以更改注释宽度��开始�判断就绪队列是否为空�非空为空根据设定的调度算法从就绪队列中调入一个进程并执行(此时进程从就绪队列中删除,赋值到表示运行中的成员变量中)�voidFCFS;//先来先服务voidSJF;/�ifm_WaitQueue.empty�选入的进程状态是否为“完成”�Y设置进程完成时间,将该进程放入完成队列�进程未完成,将进程优先数减一,并放回到就绪队列中�让系统等待一个时间片�是否达到该进程停止运行的条件�如进程已完成,或者分得的时间片个数已到N进程运行一个时间片�Y�结束�ProcessRun�TimePast�vectorPCBm_WaitQueue;//进程就绪队列vectorPCBm_FinishQueue;//完成队列�
3.算法中用到的数据结构structfcfs{//先来先服务算法从这里开始charname
[10];floatarrivetime;floatservi__time;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息
4.主要的常量变量vectorPCBm_Pro__ssQueue;//进程输入队列vectorPCBm_WaitQueue;//进程就绪队列vectorPCBm_FinishQueue;//完成队列vectorPCB::iteratorm_iter;//迭代器PCBm_runPro__ss;//运行中的进程intm_Pro__ssCount;//进程数floatm_RunTime;//运行时间intm_tagIsRun;//是否在运行标志表示正在运行,表示没有floatm_TimeSli__;//时间片大小intm_TimeSli__Count;//指时间片轮转中一次分到的时间片个数charm_SchedulerAlgorithm;//调度算法
5.主要模块voidPCBInput;//输入进程信息voidPCBSort;//对进程控制块按照优先级排序采用冒泡排序voidPro__ssSelect;//若当前就绪队列不为空则根据选择的调度算法开始调度否则,系统时间加.以等待新的进程到来voidP___isplay;//打印当前状况下就绪队列、完成队列、运行中的进程信息voidPro__ssRun;//进程运行一次运行时间加个时间片并判断进程是否达到完成条件若是则Pro__ssStatus=f.否则为w;voidPro__ssQueuePro__ss;//查看当前时间下,有无进程加入若有则把该进程调入就绪队列voidPro__ssDispatch;//进程分派,进程执行完成后决定进程该进入哪个队列就绪、完成voidTimePast{m_RunTime+=m_TimeSli__;Pro__ssQueuePro__ss;}//当前系统时间加个时间片,并检查是否有新的进程加入voidSchedulerStatistics;//调度统计,计算周转时间等voidFCFS;//先来先服务voidSJF;//最短进程优先调度voidRR;//简单时间片轮转voidPD;//最高优先数优先
四、实验代码#includecstdlib#includeiostream#includeio__nipusingnamespa__std;structfcfs{//先来先服务算法从这里开始charname
[10];floatarrivetime;floatservi__time;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息fcfsa
[100];voidinputfcfs*pintN{inti;coutendl;printf请您输入进程的名字到达时间服务时间:例如:a0100\n\n;fori=0;i=N-1;i++{printf请您输入进程%d的信息:\ti+1;scanf\t\t\t%s%f%fp[i].namep[i].arrivetimep[i].servi__time;}}voidPrintfcfs*pfloatarrivetimefloatservi__timefloatstarttimefloatfinishtimefloatzztimefloatdqzztimeintN{intk;printf\n\n调用先来先服务算法以后进程运行的顺序是:;printf%sp
[0].name;fork=1;kN;k++{printf--%sp[k].name;}coutendl;printf\n具体进程调度信息:\n;printf\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n;fork=0;k=N-1;k++{printf\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\np[k].namep[k].arrivetimep[k].servi__timep[k].starttimep[k].finishtimep[k].zztimep[k].dqzztime;}getchar;//此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪}voidsortfcfs*pintN//排序{forinti=0;i=N-1;i++forintj=0;j=i;j++ifp[i].arrivetimep[j].arrivetime{fcfstemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddealfcfs*pfloatarrivetimefloatservi__timefloatstarttimefloatfinishtimefloatzztimefloatdqzztimeintN//运行阶段{intk;fork=0;k=N-1;k++{ifk==0{p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servi__time;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servi__time;}}fork=0;k=N-1;k++{p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servi__time;}}voidFCFSfcfs*pintN{floatarrivetime=0servi__time=0starttime=0finishtime=0zztime=0dqzztime=0;sortpN;dealparrivetimeservi__timestarttimefinishtimezztimedqzztimeN;Printparrivetimeservi__timestarttimefinishtimezztimedqzztimeN;getchar;}//先来先服务算法到此结束structsjf{//最短进程优先调度算法从这里开始charname
[10];floatarrivetime;//到达时间floatservi__time;//运行时间floatstarttime;//开始时间floatfinishtime;//完成时间};sjfa1
[100];voidinputsjf*pintN1//进程信息输入{inti;coutendl;printf请您输入进程的名字到达时间服务时间:例如:a0100\n;fori=0;i=N1-1;i++{printf请您输入进程%d的信息:\ti+1;scanf\t\t\t%s%f%fp[i].namep[i].arrivetimep[i].servi__time;}}voidPrintsjf*pfloatarrivetimefloatservi__timefloatstarttimefloatfinishtimeintN1//最终结果输出{intk;printf\n\t调用最短进程优先调度算法以后进程的调度顺序为:;printf%sp
[0].name;fork=1;kN1;k++{printf--%sp[k].name;}coutendl;printf\n给个进程具体调度信息如下:\n;printf\n\t进程名\t到达时间\t运行时间\t开始时间\t完成时间\n;fork=0;k=N1-1;k++{printf\t%s\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\np[k].namep[k].arrivetimep[k].servi__timep[k].starttimep[k].finishtime;}getchar;}voidsortsjf*pintN1//排序{forinti=0;i=N1-1;i++forintj=0;j=i;j++ifp[i].arrivetimep[j].arrivetime{sjftemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddealsjf*pfloatarrivetimefloatservi__timefloatstarttimefloatfinishtimeintN1//运行阶段{intk;fork=0;k=N1-1;k++{ifk==0{p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+floatp[k].servi__time/60;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+floatp[k].servi__time/60;}}}voidsjffsjf*pintN1{floatarrivetime=0servi__time=0starttime=0finishtime=0;sortpN1;forintm=0;mN1-1;m++{ifm==0p[m].finishtime=p[m].arrivetime+floatp[m].servi__time/60;elsep[m].finishtime=p[m-1].finishtime+floatp[m].servi__time/60;inti=0;forintn=m+1;n=N1-1;n++{ifp[n].arrivetime=p[m].finishtimei++;}floatmin=p[m+1].servi__time;intnext=m+1;forintk=m+1;km+i;k++{ifp[k+1].servi__timemin{min=p[k+1].servi__time;next=k+1;}}sjftemp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}dealparrivetimeservi__timestarttimefinishtimeN1;Printparrivetimeservi__timestarttimefinishtimeN1;getchar;}//最短进程优先调度算法到这里结束charmenu//用来输出相关信息的函数{charcse1;while1{systemcls;fflushstdin;coutendl;coutendl;cout\t||欢迎||endl;cout\t||||endl;cout\t||\t实验一进程调度算法实验\t\t||endl;cout\t||||endl;cout\t||\t\t
1.先来先服务调度算法\t\t||endl;cout\t||||endl;cout\t||\t\t
2.最短进程优先调度算法\t\t||endl;cout\t||||endl;cout\t||您||endl;coutendl;coutendl;cout\t\t请输入您的选择(1/2);cse1=getchar;ifcse11||cse12cout你的输入有错!endl;elsebreak;}}int__inintar__char*argv[]{while1{switchmenu{case1:intN;coutendl;coutendl;printf\t\t---!!!@@@先来先服务调度算法@@@!!!---\n;coutendl;printf输入进程数目:;scanf%dN;inputaN;FCFSaN;case2:intN1;coutendl;coutendl;printf\t\t---!!!@@@最短进程优先调度算法@@@!!!---\n;coutendl;printf输入进程数目:;scanf%dN1;inputa1N1;sjf*b=a1;sjf*c=a1;sjffbN1;getchar;}}systemPAUSE;returnEXIT_SUC__SS;}
五、实验结果
1.执行结果
2.结果分析先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行以上就是本次进程调度实验的依据
6、实验总结通过本次实验了解到算法很重要,又更加明白算法本身可以节约时间,而且不同的函数之间在调用的时候要注意很多的问题。