时间片轮转RR进程调度算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验二时间片轮转RR进程调度算法【实验目的】通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。【实验内容】问题描述:设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。程序要求:1)进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;输入时间片大小q。2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。【源程序】#includeiostream.h#includeiomanip.h#includestdio.h#includeconio.h#includemalloc.h#includestdlib.htypedefintQElemType;#defineOK1#defineERROR0#defineOVERFLOW-1typedefintStatus;typedefstructQNode{QElemTypedata;structQNode*next;}QNode,*QueuePtr;typedefstruct{QueuePtrfront;QueuePtrrear;}LinkQueue;StatusInitQueue(LinkQueue&Q);StatusDestroyQueue(LinkQueue&Q);StatusEnQueue(LinkQueue&Q,QElemTypee);intDeQueue(LinkQueue&Q,QElemTypee);boolQueueEmpty(LinkQueue&Q);staticconstintMaxNum=100;intn,q,ArrivalTime[MaxNum],ServiceTime[MaxNum],FinishedTime[MaxNum],WholeTime[MaxNum];doubleWeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;LinkQueueQ;voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q);voidmain(){cout请输入进程数n:;cinn;while(n0||n100){cout输入的n值不正确,请重新输入!endl;cinn;}cout请输入各个进程的到达时间:;for(inti=0;in;i++)cinArrivalTime[i];cout请输入各个进程的服务时间:;for(i=0;in;i++)cinServiceTime[i];cout请输入时间片q:;cinq;while(q0||q200){cout输入的q值不正确,请重新输入!endl;cinq;}RR(ArrivalTime,ServiceTime,n,q,Q);}voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q){intcountTime=0,e;intSTime[MaxNum],pushed[MaxNum];for(inti=0;in;i++){STime[i]=ServiceTime[i];pushed[i]=0;}InitQueue(Q);EnQueue(Q,0);pushed[0]=1;inttime=0;while(QueueEmpty(Q)==false){e=DeQueue(Q,e);if(STime[e]q){STime[e]=STime[e]-q;countTime+=q;}else{countTime+=STime[e];STime[e]=0;FinishedTime[e]=countTime;}while(timecountTime){if(STime0){cout时刻setw(2)time:进程e正在运行endl;}time++;}for(i=1;in;i++){if(STime!=0&&i!=e&&ArrivalTime[i]countTime&&pushed[i]==0||STime!=0&&i!=e&&ArrivalTime[i]==countTime){EnQueue(Q,i);pushed[i]=1;}}if(STime[e]0){EnQueue(Q,e);}}for(i=0;in;i++){WholeTime[i]=FinishedTime[i]-ArrivalTime[i];WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/ServiceTime[i]);Average_WT+=WholeTime[i];Average_WWT+=WeightWholeTime[i];}Average_WT/=n;Average_WWT/=n;cout完成:;for(i=0;in;i++)coutsetw(8)FinishedTime[i];coutendl;cout周转:;for(i=0;in;i++)coutsetw(8)WholeTime[i];coutendl;cout带权:;for(i=0;in;i++)coutsetw(8)setiosflags(ios::fixed)setprecision(2)WeightWholeTime[i];coutendl;cout平均周转时间为:Average_WTendl;cout平均带权周转时间为:Average_WWTendl;DestroyQueue(Q);}StatusInitQueue(LinkQueue&Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front-next=NULL;returnOK;}StatusDestroyQueue(LinkQueue&Q){while(Q.front){Q.rear=Q.front-next;free(Q.front);Q.front=Q.rear;}returnOK;}StatusEnQueue(LinkQueue&Q,QElemTypee){QueuePtrp=(QueuePtr)malloc(sizeof(QNode));if(!p)exit(OVERFLOW);p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;returnOK;}intDeQueue(LinkQueue&Q,QElemTypee){QueuePtrp;if(Q.front==Q.rear)returnERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear==p){Q.rear=Q.front;}free(p);returne;}boolQueueEmpty(LinkQueue&Q){if(Q.front==Q.rear)returntrue;elsereturnfalse;}【实例截图】小结:通过这次实验,感觉时间片轮转RR进程调度算法还是挺复杂的,关键要掌握队列的特点,也就是顺序要清楚,哪个时刻对应运行哪一个进程要明白,再者就是要熟悉算法和进程调度的执行过程,多动手,多思考,就可以解决。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功