您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 进程调度算法实验报告
实验报告实验一:进程调度算法一、实验目的1.利用高级语言实现三种不同及进程调度算法:短作业优先算法、时间片轮转调度算法和优先级调度算法。2.通过实验理解有关进程控制块,进程队列等的概念。二、实验原理各调度算法思想:1.先来先服务算法(FCFS):按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。2.时间片轮转算法:系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。3.优先权调度算法;在创建进程时就确定优先权,确定之后在整个程序运行期间不再改变,根据优先级排列,系统会把CPU分配给优先权最高的进程。三、实验步骤、数据记录及处理1、算法流程抽象数据类型的定义:PCB块结构体类型structPCB{intname;intarrivetime;//到达时间intservicetime;//服务时间//intstarttime[max];//开始时间intfinishtime;//完成/结束时间intturntime;//周转时间intaverage_turntime;//带权周转时间intsign;//标志进程是否完成intremain_time;//剩余时间intpriority;//优先级}pcb[max];主程序的流程以及各程序模块之间的层次(调用)关系:主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。Layout()函数中选择相应的算法并调用相关函数如:FCFS()、time_segment();、Priority(),这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。程序流程图:2、运行结果分析:先来先服务算法:时间片轮转算法:优先级算法:四、总结与体会经过此次实验,我觉得具体写代码就是对解题步骤的一个细化,也发现了已往课程中学习的不足,以便日后改正。附录:源代码#includestdio.h#includemalloc.h#definemax50structPCB{intname;intarrivetime;//到达时间intservicetime;//服务时间//intstarttime[max];//开始时间intfinishtime;//完成/结束时间intturntime;//周转时间intaverage_turntime;//带权周转时间intsign;//标志进程是否完成intremain_time;//剩余时间intpriority;//优先级西安工业大学实验报告}pcb[max];voidinit(intn)//初始化{for(inti=0;in;i++){pcb[i].arrivetime=0;pcb[i].servicetime=0;//pcb[i].starttime=0;pcb[i].finishtime=0;pcb[i].turntime=0;pcb[i].average_turntime=0;pcb[i].remain_time=0;pcb[i].sign=0;pcb[i].priority=0;}}voidcreat(intn)//创建PCB{inti;for(i=1;i=n;i++){printf(\n%d:\n请依次输入进程的信息\n请输入进程名:,i);scanf(%d,&pcb[i].name);printf(请输入到达时间:);scanf(%d,&pcb[i].arrivetime);printf(请输入服务时间:);scanf(%d,&pcb[i].servicetime);printf(请输入优先级:);scanf(%d,&pcb[i].priority);pcb[i].remain_time=pcb[i].servicetime;//初始化剩余时间为服务时间}}voidFCFS(intn)//先来先服务{intstarttime;printf(请输入开始执行时间:\n);scanf(%d,&starttime);if(starttime=pcb[0].arrivetime){pcb[0].finishtime=pcb[0].servicetime+starttime;}else{pcb[0].finishtime=pcb[0].finishtime+pcb[0].servicetime;}for(inti=1;in;i++){if(pcb[i-1].finishtimepcb[i].arrivetime)pcb[i].finishtime=pcb[i-1].finishtime+pcb[i].servicetime;elsepcb[i].finishtime=pcb[i].arrivetime+pcb[i].servicetime;pcb[i].turntime=pcb[i].finishtime-pcb[i].arrivetime;pcb[i].average_turntime=pcb[i].turntime/pcb[i].servicetime;}}voidprint_FCFS(intn){//printf(进程名,到达时间\t服务时间\t完成时间\t周转时间\t周转时间:,%s\t%d\t%d\t%d\t%d\t%d\t);printf(进程名到达时间服务时间完成时间周转时间带权周转时间:\n);for(inti=0;in;i++){printf(%d,%d,%d,%d,%d,%d,pcb[i].name,pcb[i].arrivetime,pcb[i].servicetime,pcb[i].finishtime,pcb[i].turntime,pcb[i].average_turntime);printf(\n);}}voidtime_segment(intn)//时间片轮转{inti,j;intT;//时间片intflag=1;//就绪队列中是否还有进程//inttime=pcb[0].arrivetime;//当前的时间inttime=0;intsum=0;//已经完成的进程数//按各进程的arrivetime进行升序排列for(i=1;i=n;i++)for(j=i+1;j=n;j++){if(pcb[j].arrivetimepcb[i].arrivetime){pcb[0]=pcb[j];pcb[j]=pcb[i];pcb[i]=pcb[0];}}//printf(输出排序结果:\n);//for(i=1;i=n;i++)//检查排序是否正确//printf(%d\t,pcb[i].name);printf(输入时间片:\n);scanf(%d,&T);//printf(\n运行的进程名开始运行时间运行时间剩余服务时间结束时间\n);while(sumn){flag=0;//当前就绪队列中没有进程for(i=1;i=n;i++){if(pcb[i].sign==1)continue;//表示该进程已完成else{//没有完成的进程需要的时间大于一个时间片if(pcb[i].remain_timeT){flag=1;time=time+T;pcb[i].remain_time=pcb[i].remain_time-T;//printf(%10d%16d%12d%12d%12d\n,pcb[i].name,time-T,T,pcb[i].remain_time,time);}//没有完成的进程需要的时间小于或等于一个时间片elseif(pcb[i].remain_time=T){flag=1;//加入就绪队列time=time+pcb[i].remain_time;pcb[i].finishtime=time;pcb[i].sign=1;//printf(%10d%16d%12d%12d%12d\n,pcb[i].name,time-pcb[i].remain_time,pcb[i].servicetime,0,time);pcb[i].remain_time=0;}if(pcb[i].sign==1)sum++;}}//forif(flag==0&&sumn)//还有没执行的进程,且没进入就就绪队列{for(i=1;i=n;i++)if(pcb[i].sign==0){time=pcb[i].arrivetime;break;}}}//while}voidprint_time(intn){for(inti=0;in;i++){printf(\n进程名服务时间完成时间\n);printf(%6d%10d%10d,pcb[i+1].name,pcb[i].servicetime,pcb[i].finishtime);printf(\n);}}voidPriority(intn){inti,j;inttime=pcb[1].arrivetime;//按各进程的arrivetime进行升序排列,最早到达的进程先执行for(i=1;i=n;i++)for(j=i+1;j=n;j++){if(pcb[j].arrivetimepcb[i].arrivetime){pcb[0]=pcb[j];pcb[j]=pcb[i];pcb[i]=pcb[0];}}//printf(输出排序结果:\n);//for(i=1;i=n;i++)//检查排序是否正确//printf(%d\t,pcb[i].name);printf(\n进程名服务时间优先级完成时间\n);//先到达的进程第一个执行if(i=1){pcb[i].finishtime=pcb[i].arrivetime+pcb[i].servicetime;time=pcb[i].arrivetime+pcb[i].servicetime;printf(%6d%10d%10d%10d,pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);printf(\n);//测试第一个进程输出正确/*printf(输出第一个程序的:\n);printf(名称到达时间完成时间\n);printf(%4d%8d%8d,pcb[i].name,pcb[i].arrivetime,pcb[i].finishtime);printf(\n);*/i++;}//按各进程的priority进行降序排列,优先级最高的进程先执行for(i=2;i=n;i++)for(j=i+1;j=n;j++){if(pcb[j].prioritypcb[i].priority){pcb[0]=pcb[j];pcb[j]=pcb[i];pcb[i]=pcb[0];}}for(i=2;i=n;i++){time=time+pcb[i].servicetime;pcb[i].finishtime=time;printf(%6d%10d%10d%10d,pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);printf(\n);}//for}//voidvoidlayout(intn){intch=0;printf(\t\t************调度算法************\n);printf(\t\t1.先来先服务\n);printf(\t\t2.时间片轮转\n);printf(\t\t3.优先级\n);printf(选择算法:\n);scanf(%10d,&ch);switch(ch){case1:FCFS(n);print_FCFS(n);break;case2:time_segment(n);print_tim
本文标题:进程调度算法实验报告
链接地址:https://www.777doc.com/doc-5487615 .html