您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 《操作系统》实验三内容要求
《操作系统》实验二内容要求51112【实验题目】:高响应比优先调度和时间片轮转RR进程调度算法【实验学时】:4学时【实验目的】通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法。【实验内容】问题描述:设计程序模拟进程的高响应比优先调度和时间片轮转RR调度过程。假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。如果选择RR算法,则需要指定时间片大小q,采用时间片轮转RR进程调度算法进行调度,如果选择高响应比优先调度算法,则可以直接调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。程序要求如下:1)进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;如果选择时间片轮转法,则要输入时间片大小q。2)要求高响应比优先和时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。实现提示:用C++或者java语言实现提示:1)程序中进程调度时间变量描述如下:intArrivalTime[100];intServiceTime[100];intPServiceTime[100];intFinishTime[100];intWholeTime[100];doubleWeightWholeTime[100];doubleAverageWT,AverageWWT;boolFinished[100];2)进程调度的实现过程如下:变量初始化;typedefcharstring[10];/*//定义string为含有10个字符元素的字符数组类型*/structtask{stringname;/*作业号*/intarrTime;/*作业到达时间*/intserTime;/*作业要求服务时间*/intwaiTime;/*等待时间*/intbegTime;/*开始运行时间*/intfinTime;/*结束运行时间*/intturTime;/*周转时间*/intwTuTime;/*带权周转时间*/intpriority;/*优先权*/intfinish;/*是否已经完成*/}JCB[10];intnum;structstud{intname;intarrive;intrun;intrest;char*state;structstud*next;};接收用户输入n,T1,…,Tn,S1,…,Sn;structstud*create(){inta,i;structstud*head,*rear,*p,*q,*t;head=rear=NULL;printf(\n请输入进程数量:);scanf(%d,&a);printf(\n请输入进程名称到达时间和服务时间:\n例如:121\n);for(i=0;ia;i++){p=(structstud*)malloc(sizeof(structstud));scanf(%d%d%d,&p-name,&p-arrive,&p-run);p-rest=p-run;p-state=ready;if(rear==NULL){head=p;p-next=NULL;rear=p;}else{t=NULL;q=head;while(q&&q-arrivep-arrive){t=q;q=q-next;}if(q==head){p-next=head;head=p;}elseif(t==rear){rear-next=p;p-next=NULL;rear=p;}else{t-next=p;p-next=q;}}}returnhead;}选择算法,如果选择时间片轮转法,则输入时间片大小q,如果选择高响应比优先调度算法,则直接调度;voidmain(){intnumber;while(true){printf(请选择算法:\n);printf(1.高响应比优先调度算法\n);printf(2.时间片轮转RR进程调度算法\n);scanf(%d,&number);if(number==1){charagain;do{system(cls);/*清屏*/printf(pleaseinput4groupsofdatas:\n);input();check();printf(Continue...(Y/N):\n);do{again=getch();}while(again!='Y'&&again!='y'&&again!='N'&&again!='n');}while(again=='Y'||again=='y');}if(number==2){structstud*head;head=create();output(head);}}}按照用户选择的算法进行进程调度,计算进程的完成时间、周转时间和带权周转时间;//时间片轮转RR进程调度算法voidoutput(structstud*head){structstud*p,*t,*r;intslice;printf(请输入时间片:);scanf(%d,&slice);while(head!=NULL){r=p=head;while(p!=NULL){t=head;p-rest=p-rest-slice;p-state=running;if(p-rest0)p-rest=0;printf(\n**************************************\n);printf(name\tarrive\trun\trest\tstate\n);while(t!=NULL){printf(%d\t%d\t%d\t%d\t%s\n,t-name,t-arrive,t-run,t-rest,t-state);t=t-next;}if(p-rest==0)/*判断是否删除结点*/{if(p==head){head=p-next;free(p);p=head;}/*删除头结点*/else{r-next=p-next;p=r-next;r=p;}}else{r=p;p-state=ready;p=p-next;}}}}//高响应比优先度算法voidinput(){inti;system(cls);printf(\n请输入进程数量:);scanf(%d,&num);for(i=0;inum;i++){printf(\n请输入作业NO.%d:\n,i);printf(作业名称:);scanf(%s,JCB[i].name);printf(到达时间:);scanf(%d,&JCB[i].arrTime);printf(服务时间:);scanf(%d,&JCB[i].serTime);JCB[i].priority=0;JCB[i].finish=0;}}intHRN(intpre){intcurrent=1,i,j;/*优先权=(等待时间+服务时间)/服务时间*/for(i=0;inum;i++){JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime;/*等待时间=上一个作业的完成时间-到达时间*/JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;}for(i=0;inum;i++){if(!JCB[i].finish){current=i;/*找到第一个还没完成的作业*/break;}}for(j=i;jnum;j++)/*和后面的作业比较*/{if(!JCB[j].finish)/*还没完成(运行)*/{if(JCB[current].arrTime=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/{if(JCB[j].arrTime=JCB[pre].finTime&&JCB[j].priorityJCB[current].priority)current=j;/*找出到达时间在上一个作业完成之前,优先权高的作业*/}else/*如果作业是在上一个作业完成之后到达*/{if(JCB[j].arrTimeJCB[current].arrTime)current=j;/*找出比较早到达的一个*/if(JCB[j].arrTime==JCB[current].arrTime)/*如果同时到达*/if(JCB[j].priorityJCB[current].priority)current=j;/*找出服务时间比较短的一个*/}}}returncurrent;/*返回当前作业*/}voidruning(inti,inttimes,intpre,intstaTime,intendTime){if(times==0){JCB[i].begTime=JCB[i].arrTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].serTime;JCB[i].wTuTime=1.0;staTime=JCB[i].begTime;}else{if(JCB[i].arrTimeJCB[pre].finTime)JCB[i].begTime=JCB[i].arrTime;elseJCB[i].begTime=JCB[pre].finTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;}if(times==num-1)endTime=JCB[i].finTime;JCB[i].finish=1;}计算所有进程的平均周转时间和平均带权周转时间;voidprint(inti,inttimes){if(times==0){printf(名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n);}printf(%9s%9d%9d%9d%9d%9d%9d\n,JCB[i].name,JCB[i].arrTime,JCB[i].serTime,JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);}voidcheck(){inti;intstaTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;intcurrent=0,times=0,pre=0;JCB[pre].finTime=0;for(i=0;inum;i++){JCB[i].finish=0;}staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;current=0;times=0;pre=0;JCB[pre].finTime=0;printf(-------------------------------------------------------------------------\n);for(i=0;inum;i++){JCB[i].finish=0;}staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveTurTime,aveWTuTime;current=0;times=0;pre=0;JCB[pre].finTime=0
本文标题:《操作系统》实验三内容要求
链接地址:https://www.777doc.com/doc-4369997 .html