您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 作业调度(算法(c语言版))
作业调度算法设计思路:1.每个进程有一个作业控制块(JCB)表示。进程控制块包含如下信息:作业号、作业到达时间、作业要求服务时间、等待时间、开始运行时间、结束运行时间、周转时间、带权周转时间、优先权和是否已经完成;2.设置一个作业数量num;3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素;4.分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法对输入进程进行调度;5.先来先服务(FCFS)对先来的作业优先处理;6.最短作业优先(SJF)对已就绪作业进行短程序优先服务;7.响应比=(等待时间+需要服务时间)/需要服务时间,响应比高者优先(HRN)是对已就绪作业进行响应比高者优先服务,以免一些程序长时间不能被执行;8.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。开始当前作业为依编号找到第一个还没执行的作业当前作业是最后一个作业和下一个还没执行的作业比较返回这一次要执行的作业FCFS当前作业取较早到达的一个YN开始当前作业为依编号找到第一个还没执行的作业当前作业是最后一个作业和下一个还没执行的作业比较返回这一次要执行的作业当前作业取较早到达且服务时间较短的一个YN当前在上次作业被执行完之前到达同时到达当前作业取服务时间较短的一个当前作业取较早到达的一个YNYNSJF开始当前作业为依编号找到第一个还没执行的作业当前作业是最后一个作业和下一个还没执行的作业比较返回这一次要执行的作业当前作业取较早到达且相应比较高的一个YN当前在上次作业被执行完之前到达同时到达当前作业取相应比较高的一个当前作业取较早到达的一个YNYNHRN#includestdio.h#includestring.h#includeconio.h/*conio.h是一个包含一些字符处理函数的头文件,如getch(),getch()是无显示的从键盘接收一个字符,有显示的接收是getchar()*/typedefcharstring[10];/*//定义string为含有10个字符元素的字符数组类型*/structtask{stringname;/*作业号*/intarrTime;/*作业到达时间*/intserTime;/*作业要求服务时间*/intwaiTime;/*等待时间*/intbegTime;/*开始运行时间*/intfinTime;/*结束运行时间*/intturTime;/*周转时间*/intwTuTime;/*带权周转时间*/intpriority;/*优先权*/intfinish;/*是否已经完成*/}JCB[5];intnum;voidinput(){inti;system(cls);printf(\nPleaseinputtasknumber:);scanf(%d,&num);for(i=0;inum;i++){printf(\nPleaseinputtaskNO.%d:\n,i);printf(Thenameoftask:);scanf(%s,JCB[i].name);printf(Thetimearrive:);scanf(%d,&JCB[i].arrTime);printf(Thetimeneed:);scanf(%d,&JCB[i].serTime);JCB[i].priority=0;JCB[i].finish=0;}}intFCFS(){intcurrent;inti,j;for(i=0;inum;i++){if(!JCB[i].finish){current=i;/*找到第一个还没完成的作业*/break;}}for(j=i;jnum;j++)/*和后面的作业比较*/{if(!JCB[j].finish&&JCB[j].arrTimeJCB[current].arrTime){current=j;/*找出先来的未完成作业*/}}returncurrent;/*返回当前作业*/}intSJF(intpre){intcurrent,i,j;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].serTimeJCB[current].serTime)current=j;/*找出到达时间在上一个作业完成之前,服务时间比较小的未完成作业*/}else/*如果作业是在上一个作业完成之后到达*/{if(JCB[j].arrTimeJCB[current].arrTime)current=j;/*找出比较早到达的一个*/if(JCB[j].arrTime==JCB[current].arrTime)/*如果同时到达*/if(JCB[j].serTimeJCB[current].serTime)current=j;/*找出服务时间比较短的一个*/}}}returncurrent;/*返回当前作业*/}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(namearrTimeserTimebegTimefinTimeturTimewTuTime\n);}printf(%9s%9d%9d%9d%9d%9df%9df\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;printf(\n--FCFS-----------------------------------------------------------------\n);for(times=0;timesnum;times++){current=FCFS();runing(current,times,pre,staTime,endTime);print(current,times);pre=current;}for(i=0;inum;i++){sumTurTime+=JCB[i].turTime;sumWTuTime+=JCB[i].wTuTime;}aveTurTime=sumTurTime/num;aveWTuTime=sumWTuTime/num;printf((total)%9.2f%9.2f%9.2f%9.2f\n,staTime,endTime,aveTurTime,aveWTuTime);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;printf(\n--SJF------------------------------------------------------------------\n);for(times=0;timesnum;times++){current=SJF(pre);runing(current,times,pre,staTime,endTime);print(current,times);pre=current;}for(i=0;inum;i++){sumTurTime+=JCB[i].turTime;sumWTuTime+=JCB[i].wTuTime;}aveTurTime=sumTurTime/num;aveWTuTime=sumWTuTime/num;printf((total)%9d%9d%9d%9d\n,staTime,endTime,aveTurTime,aveWTu
本文标题:作业调度(算法(c语言版))
链接地址:https://www.777doc.com/doc-5744313 .html