还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验二作业调度
1.实验题目
1、编写并调试一个单道处理系统的作业等待模拟程序作业调度算法分别采用先来先服务(FCFS),最短作业优先(SJF)的调度算法
(1)先来先服务算法按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选
(2)最短作业优先算法是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业
2.实验目的本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三.实验过程一单道处理系统作业调度1单道处理程序作业调度实验的源程序:zuoye.c执行程序:zuoye.exe2实验分析
1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素
2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等作业的状态可以是等待WWait、运行RRun和完成FFinish三种状态之一每个作业的最初状态总是等待W
3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间3流程图:二.最短作业优先算法三.高响应比算法图一.先来先服务流程图4源程序:#includestdio.h#includestdlib.h#includeconio.h#definegetpchtypetype*__llocsizeoftype#defineNULL0intn;floatT1=0T2=0;inttimes=0;structjcb//作业控制块{charname
[10];//作业名intreachtime;//作业到达时间intstarttime;//作业开始时间intneedtime;//作业需要运行的时间floatsuper;//作业的响应比intfinishtime;//作业完成时间floatcycletime;//作业周转时间floatcltime;//作业带权周转时间charstate;//作业状态structjcb*next;//结构体指针}*ready=NULL*p*q;typedefstructjcbJCB;voidinize//初始化界面{printf\n\n\t\t*********************************************\t\t\n;printf\t\t\t\t实验二作业调度\n;printf\t\t*********************************************\t\t\n;printf\n\n\n\t\t\t\t\t计算机学院软件四班\n;printf\t\t\t\t\t蓝小花\n;printf\t\t\t\t\t3204007102\n;printf\t\t\t\t\t完成日期2006年11月17号;printf\n\n\n\t\t请输入任意键进入演示过程\n;getch;}voidinital//建立作业控制块队列先将其排成先来先服务的模式队列{inti;printf\n输入作业数:;scanf%dn;fori=0;in;i++{p=getpchJCB;printf\n输入作业名:;scanf%sp-name;getch;p-reachtime=i;printf作业默认到达时间:%di;printf\n输入作业要运行的时间:;scanf%dp-needtime;p-state=W;p-next=NULL;ifready==NULLready=q=p;else{q-next=p;q=p;}}}voiddispJCB*qintm//显示作业运行后的周转时间及带权周转时间等{ifm==3//显示高响应比算法调度作业后的运行情况{printf\n作业%s正在运行,估计其运行情况\nq-name;printf开始运行时刻%d\nq-starttime;printf完成时刻%d\nq-finishtime;printf周转时间%f\nq-cycletime;printf带权周转时间%f\nq-cltime;printf相应比:%f\nq-super;getch;}else//显示先来先服务最短作业优先算法调度后作业的运行情况{printf\n作业%s正在运行,估计其运行情况\nq-name;printf开始运行时刻%d\nq-starttime;printf完成时刻%d\nq-finishtime;printf周转时间%f\nq-cycletime;printf带权周转时间%f\nq-cltime;getch;}}voidrunningJCB*pintm//运行作业{ifp==ready//先将要运行的作业从队列中分离出来{ready=p-next;p-next=NULL;}else{q=ready;whileq-next!=pq=q-next;q-next=p-next;}p-starttime=times;//计算作业运行后的完成时间周转时间等等p-state=R;p-finishtime=p-starttime+p-needtime;p-cycletime=floatp-finishtime-p-reachtime;p-cltime=floatp-cycletime/p-needtime;T1+=p-cycletime;T2+=p-cltime;disppm;//调用disp函数显示作业运行情况times+=p-needtime;p-state=F;printf\n%shasbeenfinished!\npressanykeytocontinue...\np-name;freep;//释放运行后的作业getch;}voidsuper//计算队列中作业的高响应比{JCB*padv;padv=ready;do{ifpadv-state==Wpadv-reachtime=timespadv-super=floattimes-padv-reachtime+padv-needtime/padv-needtimepadv=padv-next;}whilepadv!=NULL;}voidfinal//最后打印作业的平均周转时间平均带权周转时间{floatst;t=T1/n;s=T2/n;getch;printf\n\n作业已经全部完成!;printf\n%d个作业的平均周转时间是%fnt;printf\n%d个作业的平均带权周转时间是%f\n\n\nns;}voidhrnintm//高响应比算法{JCB*min;intiiden;systemcls;inital;fori=0;in;i++{p=min=ready;iden=1;super;do{ifp-state==Wp-reachtime=timesifiden{min=p;iden=0;}elseifp-supermin-supermin=p;p=p-next;}whilep!=NULL;ifiden{i--;times++;//printf\ntime=%d:\tnoJCBsubmib...wait...time;iftimes1000{printf\nruntimeistoolong...error...;getch;}}else{runningminm;//调用running函数}}//forfinal;//调用running函数}voidsjfintm//最短作业优先算法{JCB*min;intiiden;systemcls;inital;fori=0;in;i++{p=min=ready;iden=1;do{ifp-state==Wp-reachtime=timesifiden{min=p;iden=0;}elseifp-needtimemin-needtimemin=p;p=p-next;}whilep!=NULL;ifiden{i--;//printf\ntime=%d:\tnoJCBsubmib...wait...time;times++;iftimes100{printf\nruntimeistoolong...error;getch;}}else{runningminm;//调用running函数}}//forfinal;//调用running函数}voidfcfsintm//先来先服务算法{intiiden;systemcls;inital;fori=0;in;i++{p=ready;iden=1;do{ifp-state==Wp-reachtime=timesiden=0;ifidenp=p-next;}whilep!=NULLiden;ifiden{i--;printf\n没有满足要求的进程需等待;times++;iftimes100{printf\n时间过长;getch;}}else{runningpm;//调用running函数}}final;//调用running函数}voidmune{intm;systemcls;printf\n\n\t\t*********************************************\t\t\n;printf\t\t\t\t作业调度演示\n;printf\t\t*********************************************\t\t\n;printf\n\n\n\t\t\t
1.先来先服务算法.;printf\n\t\t\t
2.最短作业优先算法.;printf\n\t\t\t
3.响应比高者优先算法;printf\n\t\t\t
0.退出程序.;printf\n\n\t\t\t\t选择所要操作:;scanf%dm;switchm{case1:fcfsm;getch;systemcls;mune;break;case2:sjfm;getch;systemcls;mune;break;case3:hrnm;getch;systemcls;mune;break;case0:systemcls;break;default:printf选择错误重新选择.;getch;systemcls;mune;}}__in//主函数{inize;mune;}5调试结果:
1.选择操作的界面
2.输入操作初始信息:
3.先来先服务算法作业调度结果:调度顺序:a-b-c-d-e
4.最短作业优先算法作业调度结果调度顺序:a-d-b-e-c
5.高响应比算法作业调度结果:调度顺序a-b-d-c-e代替代替。