您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 进程调度算法实验报告
操作系统实验报告(二)实验题目:进程调度算法实验环境:C++实验目的:编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。设计分析:程序流程图:1.先来先服务算法2.短进程优先算法初始化PCB,输入进程信息开始各进程按先来先到的顺序进入就绪队列就绪队列?结束运行运行进程所需CPU时间取消该进程3.时间片轮转调度算法实验代码:1.先来先服务算法#includeiostream.h#definen20typedefstruct{intid;//进程名intatime;//进程到达时间intruntime;//进程运行时间}fcs;voidmain(){intamount,i,j,diao,huan;fcsf[n];cout请输入进程个数:endl;cinamount;for(i=0;iamount;i++){cout请输入进程名,进程到达时间,进程运行时间:endl;cinf[i].id;cinf[i].atime;cinf[i].runtime;}for(i=0;iamount;i++)//按进程到达时间的先后排序{//如果两个进程同时到达,按在屏幕先输入的先运行for(j=0;jamount-i-1;j++){if(f[j].atimef[j+1].atime){diao=f[j].atime;f[j].atime=f[j+1].atime;f[j+1].atime=diao;huan=f[j].id;f[j].id=f[j+1].id;f[j+1].id=huan;}}}for(i=0;iamount;i++){cout进程:f[i].id从f[i].atime开始,在f[i].atime+f[i].runtime之前结束。endl;f[i+1].atime=f[i].atime+f[i].runtime;}}2.短进程优先算法#includestdio.h#definen5#definenum5#definemax65535typedefstructpro{intPRO_ID;intarrive_time;intsum_time;intflag;}Pro;//整数排序intbubble(inttemp[]){inti,j,tem=0;for(i=1;inum;i++){intlastX=1;for(j=0;jnum-i;j++){if(temp[j]temp[j+1]){tem=temp[j];temp[j]=temp[j+1];temp[j+1]=tem;lastX=0;}}if(lastX==1)break;}returntemp[0];}//进程排序Probubble(Prop[]){inti,j;Protemp={0};Pros[num];for(i=0;inum;i++){s[i]=p[i];}for(i=1;inum;i++){intlastX=1;for(j=0;jnum-i;j++){if(s[j].sum_times[j+1].sum_time){temp=s[j];s[j]=s[j+1];s[j+1]=temp;lastX=0;}}if(lastX==1)break;}returns[0];}voidSPF(intp){if(n0){inti,j,k,l,tc=0;Proseq[n];Protemp_seq[n];printf(短进程优先调度算法SPF\n);printf(请依次输入5个进程的进程号、到达时间和执行时间\n);printf(成员变量用逗号隔开;进程间用回车隔开\n);for(i=0;in;i++){scanf(%d,%d,%d,&seq[i].PRO_ID,&seq[i].arrive_time,&seq[i].sum_time);}printf(调度顺序是:\n);//初始化tcinttemp[num];for(i=0;inum;i++){temp[i]=seq[i].arrive_time;}tc=bubble(temp);//tc是断点啊//flag表示对应i的pro的队列情况//-1表示未进入过队列,0表示在队列中,1表示被清除了for(i=0;in;i++){seq[i].flag=-1;}for(i=0;in;i++){for(j=0;jn;j++){if(seq[j].flag!=1&&seq[j].arrive_time=tc){seq[j].flag=0;}}for(j=0;jn;j++){temp_seq[j]=seq[j];if(seq[j].flag!=0){temp_seq[j].sum_time=max;}}l=bubble(temp_seq).PRO_ID;for(j=0;jn;j++){if(l==seq[j].PRO_ID){k=j;}}tc=tc+bubble(temp_seq).sum_time;seq[k].flag=1;printf(%d,l);}printf(\n);}}voidmain(){SPF(n);}3.时间片轮转调度算法头文件RR.h#includeiostream#includestdio.h#includestring.h#includestdlib.h#includectype.h#defineMaxNum100typedefstructpcb//定义进程控制块{charName[MaxNum];//进程名intarrivetime;//到达时间intruntime;//运行时间intwholetime;//固定运行时间intFinishTime;//完成时间doubleWeightTime;//周转时间doubleWeightWholeTime;//带权周转时间charstate;//运行后的状态structpcb*next;}PCB;//全局变量intN;//实际进程数doubleSumWT;//周转时间之和doubleSumWWT;//带权周转时间之和doubleAverageWT;//平均周转时间doubleAverageWWT;//平均带权周转时间typedefstruct//定义队列,封装头结点,指针分别指向队头和队尾{PCB*front,*rear;}queue;queue*init()//进程队列置空{queue*head;head=(queue*)malloc(sizeof(queue));head-front=NULL;head-rear=NULL;returnhead;}intempty(queue*head)//检验队列是否为空{return(head-front?0:1);}queue*append(queue*head,charc[MaxNum],inta,intr,chars)//进程队列入队,往后插入{PCB*p;p=(PCB*)malloc(sizeof(PCB));strcpy(p-Name,c);p-arrivetime=a;p-runtime=r;p-wholetime=r;p-state=s;//p-FinishTime=0;//p-WeightTime=0;//p-WeightWholeTime=0;p-next=NULL;if(empty(head))head-front=head-rear=p;else{head-rear-next=p;head-rear=p;}returnhead;}queue*creat(queue*head)//创建进程队列{charc[MaxNum];chars='R';inta,r,i;printf(请输入共有几个进程:\n);scanf(%d,&N);for(i=1;i=N;i++){printf(请输入第%d个进程的进程名:\n,i);getchar();gets(c);printf(请输入第%d个进程的到达时间:\n,i);scanf(%d,&a);printf(请输入第%d个进程的服务时间:\n,i);scanf(%d,&r);head=append(head,c,a,r,s);}returnhead;}voidprint(queue*head)//输入创建的进程队列{PCB*p;p=head-front;if(!p)printf(时间片轮转调度队列为空!\n);while(p){printf(Name=%sarrivetime=%druntime=%dstate=%c,p-Name,p-arrivetime,p-runtime,p-state);printf(\n);p=p-next;}}/*******************时间片轮转法调度算法的实现**************************/voidRR(queue*head,intq){intt=head-front-arrivetime,lt=head-rear-arrivetime;if(head-front-runtimeq)t=t+head-front-runtime;elset=t+q;/****进程队列为不空才可调度*****/while(!empty(head)){PCB*p1,*p2;printf(\n时刻进程运行后的状态\n);/*第一种情况:当前运行的时间小于最后一个进程到达时间做一下操作*/while(tlt){p1=head-front;printf(%2d%s,t,p1-Name);p1-runtime=p1-runtime-q;//1.运行时间小于0,删除队首if(p1-runtime=0){p1-state='C';printf(%c\n,p1-state);p1-FinishTime=t;p1-WeightTime=p1-FinishTime-p1-arrivetime;p1-WeightWholeTime=p1-WeightTime/p1-wholetime;SumWT+=p1-WeightTime;SumWWT+=p1-WeightWholeTime;printf(时刻%2d进程%s运行结束,进程%s周转时间=%5.2f,带权周转时间=%5.2f\n,t,p1-Name,p1-Name,p1-WeightTime,p1-WeightWholeTime);head-front=p1-next;free(p1);}//2.运行时间大于0,向后找位置插入else{printf(%c\n,p1-state);p2=p1-next;while(p2-next&&p2-arrivetime!=t){p2=p2-next;}//此时无新进入队列的进程,有两种情况:1.不用找位置往后插入,队首不变,不做操作//2.找位置往后插入if(p2-arrivetime!=t){PCB*p3=p1,*p4;while(p3-next&&p3-arrivetimet){p4=p3;p3=p3-next;}if(p3-arrivetimet){if(p4!=p1)//p1插在p4后,头为p1-next{head-front=p1-next;p1-next=p4-next;p4-next=p1;}else//不做操作p4=p3=p2=NULL;}elsep4=p3=p2=NULL;}//此时有新进入队列的进程时:p1插在新进入队列的进程p2后,队首为p1-nextelse{head-front=p1-next;p1-next=p2-next;p2-next=p1;}}//时刻变化i
本文标题:进程调度算法实验报告
链接地址:https://www.777doc.com/doc-2398852 .html