您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统实验-先来先服务、短作业优先算法
1实验报告【实验名称】实验一进程调度【实验目的】巩固和加深处理机调度的概念。【实验内容】设计调度算法,模拟实现处理机的调度。1.设计先来先服务调度算法数据结构和符号说明:typedefstructPCB{charname[10];//进程名charstate;//进程状态intarrivetime;//到达时间intstarttime;//开始时间intfinishtime;//完成时间intservicetime;//服务时间floatturnaroundtime;//周转时间floatweightedturnaroundtime;//带权周转时间structPCB*next;//指向下个进程的指针}pcb;inttime;//全局变量,计时器intn;//全局变量,进程个数pcb*head=NULL,*p,*q;//进程链表指针流程图:2开始输入进程名、到达时间、服务时间存入链表进程是否全部处理完毕?当前进程状态是否为F?N处理进程,计算完成时间,周转时间等,并更新当前时间Y处理下一进程N结束Y程序源代码/*操作系统实验一先来先服务调度算法*/#includestdio.h#includestdlib.htypedefstructPCB//进程控制{charname[10];//进程名charstate;//进程状态intarrivetime;//到达时间intstarttime;//开始时间intfinishtime;//结束时间intservicetime;//服务时间floatturnaroundtime;//周转时间floatweightedturnaroundtime;//带权周转时间structPCB*next;//指向下个进程}pcb;inttime;//当前时间intn;//进程个数pcb*head=NULL,*p,*q;//处理未完成的进程voidrun_fcfs(pcb*p1){time=p1-arrivetimetime?p1-arrivetime:time;//如果进程到达时间大于当前时间,则当前时间=到达时间p1-starttime=time;//当前时间即为进程开始时间3printf(\n现在时间是%d,开始运行作业%s\n,time,p1-name);time+=p1-servicetime;//进程开始处理,处理的时间为进程的服务时间p1-state='T';//更改状态,表示该进程已被处理过p1-finishtime=time;//存入完成时间p1-turnaroundtime=p1-finishtime-p1-arrivetime;//周转时间=完成时间-到达时间p1-weightedturnaroundtime=p1-turnaroundtime/p1-servicetime;//带权周转时间=周转时间/服务时间printf(到达时间服务时间开始时间完成时间周转时间带权周转时间\n);printf(%8d%10d%10d%10d%10.1f%14.2f\n,p1-arrivetime,p1-servicetime,p1-starttime,p1-finishtime,p1-turnaroundtime,p1-weightedturnaroundtime);//打印输出}//找到当前未完成的进程voidfcfs(){inti,j;p=head;for(i=0;in;i++){if(p-state=='F'){q=p;//如果当前进程未执行,则开始执行run_fcfs(q);}p=p-next;指向下一个进程}}//输入进程个数与进程信息voidgetInfo(){intnum;printf(\n作业个数:);scanf(%d,&n);for(num=0;numn;num++){p=(pcb*)malloc(sizeof(pcb));printf(依次输入:\n);printf(进程名到达时间服务时间\n);scanf(%s\t%d\t%d,&p-name,&p-arrivetime,&p-servicetime);if(head==NULL){head=p;q=p;time=p-arrivetime;}if(p-arrivetimetime)4time=p-arrivetime;q-next=p;p-starttime=0;p-finishtime=0;p-turnaroundtime=0;p-weightedturnaroundtime=0;p-next=NULL;p-state='F';q=p;}}intmain(){printf(先来先服务调度算法\n);getInfo();p=head;fcfs();return0;}运行结果图1运行结果2.设计按短进程优先调度算法5数据结构与符号说明:structsjf{charname[10];//进程名floatarrivetime;//到达时间floatservicetime;//服务时间floatstarttime;//开始时间floatfinishtime;//完成时间floatturnaroundtime;//周转时间floatdqturnaroundtime;//带权周转};//结构体数组sjfa[100];流程图:程序源代码/*操作系统实验一按短进程优先调度算法*/#includestdio.hstructsjf{charname[10];//进程名floatarrivetime;//到达时间floatservicetime;//服务时间floatstarttime;//开始时间floatfinishtime;//完成时间floatturnaroundtime;//周转时间floatdqturnaroundtime;//带权周转};//结构体数组sjfa[100];//输入函数voidinput(sjf*p,intN){inti;printf(依次输入:\n);for(i=0;i=N-1;i++){printf(进程名到达时间服务时间\n);scanf(%s%f%f,&p[i].name,&p[i].arrivetime,&p[i].servicetime);6}}//输出函数voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatturnaroundtime,floatdqturnaroundtime,intN){intk;printf(\n进程名到达时间服务时间开始时间完成时间周转时间带权周转时间\n);for(k=0;k=N-1;k++){printf(%4s%10.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].turnaroundtime,p[k].dqturnaroundtime);}}//按到达时间排序voidsort(sjf*p,intN){for(inti=0;i=N-1;i++)for(intj=0;j=i;j++)if(p[i].arrivetimep[j].arrivetime){sjftemp;temp=p[i];p[i]=p[j];p[j]=temp;}}//处理作业voiddeal(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&turnaroundtime,float&dqturnaroundtime,intN){intk;for(k=0;k=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;//第一个进程的开始时间=到达时间p[k].finishtime=p[k].arrivetime+p[k].servicetime;}//完成时间=到达时间+服务时间else{if(p[k-1].finishtime=p[k].arrivetime){p[k].starttime=p[k-1].finishtime;}//前一项作业的完成时间大于当前项的到达时间则7当前项的开始时间为前一项的结束时间else{p[k].starttime=p[k].arrivetime;//否则当前项的开始时间为当前项的到达时间}p[k].finishtime=p[k].starttime+p[k].servicetime;//完成时间=作业开始时间+作业服务时间}}for(k=0;k=N-1;k++){p[k].turnaroundtime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间p[k].dqturnaroundtime=p[k].turnaroundtime/p[k].servicetime;//带权周转时间=周转时间/服务时间}}//短作业优先调度算法voidsjff(sjf*p,intN){floatarrivetime=0;floatservicetime=0;floatstarttime=0;floatfinishtime=0;floatturnaroundtime=0;floatdqturnaroundtime=0;sort(p,N);//调用sort函数进行排序for(intm=0;mN-1;m++){if(m==0)//第一项作业p[m].finishtime=p[m].arrivetime+p[m].servicetime;//完成时间=到达时间+服务时间else{if(p[m-1].finishtime=p[m].arrivetime){p[m].starttime=p[m-1].finishtime;}//上一项进程结束后本进程才开始else{p[m].starttime=p[m].arrivetime;}p[m].finishtime=p[m].starttime+p[m].servicetime;//完成时间=开始时间+服务时间}inti=0;for(intn=m+1;n=N-1;n++){if(p[n].arrivetime=p[m].finishtime)i++;}//按服务时间排序8floatmin=p[m+1].servicetime;intnext=m+1;//m+1=nfor(intk=m+1;km+i;k++){if(p[k+1].servicetimemin)//k+1项的服务时间小于最小项则k+1项为最小项{min=p[k+1].servicetime;next=k+1;}}sjftemp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,turnaroundtime,dqturnaroundtime,N);Print(p,arrivetime,servicetime,starttime,finishtime,turnaroundtime,dqturnaroundtime,N);}intmain(){intN;printf(短作业优先调度算法\n);printf(\n作业个数:);scanf(%d,&N);input(a,N);sjf*b=a;sjff(b,N);//调用sjff函数}运行结果9图2运行结果
本文标题:操作系统实验-先来先服务、短作业优先算法
链接地址:https://www.777doc.com/doc-4969728 .html