一、实验题目进程调度二、实验目的加深对进程、处理机调度的概念及进程调度各种算法(先来先服务、短作业优先、高响应比优先)的理解。三、实验要求要求用C语言设计一个模拟单处理机系统下各种调度算法的思想。要求各种算法均采用非抢占式的调度方式。四、实验内容设计按先来先服务调度的算法、短作业优先调度的算法和高响应比优先调度算法要求:1、输出进程的执行顺序2、输出算法的平均周转时间和平均带权周转时间五、实验原理先来先服务调度算法的基本思想是:每次调度是从就绪队列中,选择一个最先进入该队列的进程,把处理机分配给它,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,才放弃处理机。短作业优先调度算法的基本思想是:每次调度是从就绪队列中,选择一个运行时间最短的作业,把处理机分配给它,使之投入运行。该作业程一直运行到完成或发生某事件而阻塞后,才放弃处理机。高响应比优先调度算法的基本思想是:……………………………………………………六、实验步骤程序设计:#includestdio.h#includestdlib.h#includeconio.h#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0intn;floatT1=0,T2=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请输入任意键进入演示过程\n);getch();}voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列{inti;printf(\n输入作业数:);scanf(%d,&n);for(i=0;in;i++){p=getpch(JCB);printf(\n输入作业名:);scanf(%s,p-name);getch();p-reachtime=i;printf(作业默认到达时间:%d,i);printf(\n输入作业要运行的时间:);scanf(%d,&p-needtime);p-state='W';p-next=NULL;if(ready==NULL)ready=q=p;else{q-next=p;q=p;}}}voiddisp(JCB*q,intm)//显示作业运行后的周转时间及带权周转时间等{if(m==3)//显示高响应比算法调度作业后的运行情况{printf(\n作业%s正在运行,估计其运行情况:\n,q-name);printf(开始运行时刻:%d\n,q-starttime);printf(完成时刻:%d\n,q-finishtime);printf(周转时间:%f\n,q-cycletime);printf(带权周转时间:%f\n,q-cltime);printf(相应比:%f\n,q-super);getch();}else//显示先来先服务,最短作业优先算法调度后作业的运行情况{printf(\n作业%s正在运行,估计其运行情况:\n,q-name);printf(开始运行时刻:%d\n,q-starttime);printf(完成时刻:%d\n,q-finishtime);printf(周转时间:%f\n,q-cycletime);printf(带权周转时间:%f\n,q-cltime);getch();}}voidrunning(JCB*p,intm)//运行作业{if(p==ready)//先将要运行的作业从队列中分离出来{ready=p-next;p-next=NULL;}else{q=ready;while(q-next!=p)q=q-next;q-next=p-next;}p-starttime=times;//计算作业运行后的完成时间,周转时间等等p-state='R';p-finishtime=p-starttime+p-needtime;p-cycletime=(float)(p-finishtime-p-reachtime);p-cltime=(float)(p-cycletime/p-needtime);T1+=p-cycletime;T2+=p-cltime;disp(p,m);//调用disp()函数,显示作业运行情况times+=p-needtime;p-state='F';printf(\n%shasbeenfinished!\npressanykeytocontinue...\n,p-name);free(p);//释放运行后的作业getch();}voidsuper()//计算队列中作业的高响应比{JCB*padv;padv=ready;do{if(padv-state=='W'&&padv-reachtime=times)padv-super=(float)(times-padv-reachtime+padv-needtime)/padv-needtimepadv=padv-next;}while(padv!=NULL);}voidfinal()//最后打印作业的平均周转时间,平均带权周转时间{floats,t;t=T1/n;s=T2/n;getch();printf(\n\n作业已经全部完成!);printf(\n%d个作业的平均周转时间是:%f,n,t);printf(\n%d个作业的平均带权周转时间是%f:\n\n\n,n,s);}voidhrn(intm)//高响应比算法{JCB*min;inti,iden;system(cls);inital();for(i=0;in;i++){p=min=ready;iden=1;super();do{if(p-state=='W'&&p-reachtime=times)if(iden){min=p;iden=0;}elseif(p-supermin-super)min=p;p=p-next;}while(p!=NULL);if(iden){i--;times++;//printf(\ntime=%d:\tnoJCBsubmib...wait...,time);if(times1000){printf(\nruntimeistoolong...error...);getch();}}else{running(min,m);//调用running()函数}}//forfinal();//调用running()函数}voidsjf(intm)//最短作业优先算法{JCB*min;inti,iden;system(cls);inital();for(i=0;in;i++){p=min=ready;iden=1;do{if(p-state=='W'&&p-reachtime=times)if(iden){min=p;iden=0;}elseif(p-needtimemin-needtime)min=p;p=p-next;}while(p!=NULL);if(iden){i--;//printf(\ntime=%d:\tnoJCBsubmib...wait...,time);times++;if(times100){printf(\nruntimeistoolong...error);getch();}}else{running(min,m);//调用running()函数}}//forfinal();//调用running()函数}voidfcfs(intm)//先来先服务算法{inti,iden;system(cls);inital();for(i=0;in;i++){p=ready;iden=1;do{if(p-state=='W'&&p-reachtime=times)iden=0;if(iden)p=p-next;}while(p!=NULL&&iden);if(iden){i--;printf(\n没有满足要求的进程,需等待);times++;if(times100){printf(\n时间过长);getch();}}else{running(p,m);//调用running()函数}}final();//调用running()函数}voidmune(){intm;system(cls);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\t1.先来先服务算法.);printf(\n\t\t\t2.最短作业优先算法.);printf(\n\t\t\t3.响应比高者优先算法);printf(\n\t\t\t0.退出程序.);printf(\n\n\t\t\t\t选择所要操作:);scanf(%d,&m);switch(m){case1:fcfs(m);getch();system(cls);mune();break;case2:sjf(m);getch();system(cls);mune();break;case3:hrn(m);getch();system(cls);mune();break;case0:system(cls);break;default:printf(选择错误,重新选择.);getch();system(cls);mune();}}main()//主函数{inize();mune();}调试结果:1.选择操作的界面2.输入操作初始信息:3.先来先服务算法作业调度结果:(调度顺序:a-b-c-d-e)4.最短作业优先算法作业调度结果(调度顺序:a-d-b-e-c)5.高响应比算法作业调度结果:(调度顺序a-b-d-c-e)七.实验总结:通过本次试验我掌握了作业调度的三种方法:先来先服务调度、短作业优先调度、高响应比优先调度、明确了各种调度算法的优缺点及使用情况和条件,学会了各种算法的原理,能熟练地运用。