您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验六-进程调度算法模拟实现
实验六进程调度算法模拟一、实验类型本实验为设计性实验。二、实验目的与任务1)通过对进程调度算法的设计,加深对进程调度原理的理解,进一步掌握各种调度算法的特征;2)针对你所选择的算法的模拟情况进行对算法进行评价(通过比较计算平均周转时间和平均带权周转时间)。三、预习要求1)理解各调度算法原理;2)理解平均周转时间和平均带权周转时间四、实验基本原理(1)设计程序模拟先来先服务(FCFS)进程调度、短进程优先调度(SJF)、高响应比优先调度(HRN)、最高优先权优先调度、时间片轮转调度等算法,要求比较所选算法的平均周转时间和平均带权周转时间,可选用C、C++或Java等编程语言中任一种语言。(2)自设模拟的情景,但要求至少包括四个进程调度。注意,问题情境最好允许用户设定。即当程序启动时,应允许用户可以选择不同的调度算法;然后用户从控制台输入各个进程的信息,进程信息输入完毕后,就开始了进程调度。参考代码如下:(3)认真完成实验报告,同时要求说明模拟的情境、数据结构的使用,程序流程图或步骤,并给出实验结果分析和实验小结;五、实验仪器与设备(或工具软件)实验设备:计算机一台;六、实验内容[参考代码如下]#includestdio.h#includestdlib.hvoiddayin();typedefstructPCB//定义进程控制块{charnum[2];//进程号charstate;//运行状态inttijiaotime;//提交进程时间intstarttime;//进程开始时间intfinishtime;//结束时间intneedtime;//运行需要时间floatroundtime;//周转时间floatweightroundtime;//带权周转时间structPCB*next;//指向下个进程}pcb;inttime=10000,n;//计时器(假设当前时间)floatsumroundtime=0,sumweightroundtime=0,avgroundtime,avgweightroundtime;//定义全局平均变量。pcb*head=NULL,*p,*q;//进程全局指针。voidrun_fcfs(pcb*p1)//进程执行过程{time=p1-tijiaotimetime?p1-tijiaotime:time;//获得真正的当前时间。p1-starttime=time;//printf(\n现在时间是%d,开始运行进程%s\n,time,p1-num);time+=p1-needtime;p1-state='F';p1-finishtime=time;p1-roundtime=p1-finishtime-p1-tijiaotime;p1-weightroundtime=(float)(p1-finishtime-p1-tijiaotime)/(float)p1-needtime;sumroundtime+=p1-roundtime;sumweightroundtime+=p1-weightroundtime;}voidrun_spf(pcb*p1,intt)//模拟进程执行过程{p1-starttime=t;p1-state='W';p1-finishtime=t+p1-needtime;p1-roundtime=p1-finishtime-p1-tijiaotime;p1-weightroundtime=(p1-finishtime-p1-tijiaotime)/(float)p1-needtime;sumroundtime+=p1-roundtime;sumweightroundtime+=p1-weightroundtime;}voidfcfs()//从队首分别取出进程(找到满足条件的进程,并执行。){inti,j,t;for(j=0;jn;j++){p=head;t=10000;for(i=0;in;i++)//找到当前未完成的最早进程{if(p-tijiaotimet&&p-state=='W'){t=p-tijiaotime;q=p;//标记当前未完成的进程}p=p-next;}run_fcfs(q);}avgroundtime=sumroundtime/n;avgweightroundtime=sumweightroundtime/n;}/////////////////////////////////////////////////////////////////voidspf()//从队首分别取出进程(找到满足条件的最短进程,并执行。){inti,j,t,k,futmin,flag;t=10000;///p=head;for(i=0;in;i++)//找到当前未完成的最短进程{if(p-tijiaotimet&&p-state=='F')t=p-tijiaotime;//记录范围内。最早完成时间。p=p-next;}///k=0;while(kn){flag=0;futmin=10000;//最小的一个服务时间。(在范围内总是可以找到最小的一个服务时间。)p=head;for(i=0;in;i++)//找到当前未完成的进程{if(p-tijiaotime=t&&p-state=='F'&&p-needtime=futmin){futmin=p-needtime;//每一次都要修改当前最早时间。q=p;//标记当前未完成的进程flag=1;}p=p-next;}if(flag==1){k++;run_spf(q,t);t=t+q-needtime;//t为当前时间。用于筛选进程下一个进程的当前时间。}else{t=10000;///p=head;for(i=0;in;i++)//找到当前未完成的进程{if(p-tijiaotimet&&p-state=='F'){t=p-tijiaotime;//记录范围内。最早完成时间。}p=p-next;}}}avgroundtime=sumroundtime/n;avgweightroundtime=sumweightroundtime/n;}///////////////////////////////////////////////////////voidgetInfo()//创建进程{intnum;printf(\n请输入进程个数:);scanf(%d,&n);printf(\n依次输入%d个进程:\n,n);dayin();printf(进程名到达时间运行时间\n);for(num=0;numn;num++){p=(pcb*)malloc(sizeof(pcb));if(head==NULL){head=p;q=p;}dayin();scanf(%s\t%d\t%d,&p-num,&p-tijiaotime,&p-needtime);if(p-tijiaotimetime)time=p-tijiaotime;//记录最早时间。q-next=p;p-starttime=0;p-finishtime=0;p-roundtime=0;p-weightroundtime=0;p-next=NULL;p-state='W';q=p;}}voiddisplay(){printf(\n\n进程名\t\t);p=head;while(p!=NULL){printf(%s\t,p-num);p=p-next;}printf(平均);printf(\n到达时间\t);p=head;while(p!=NULL){printf(%d\t,p-tijiaotime);p=p-next;}printf(\n运行时间\t);p=head;while(p!=NULL){printf(%d\t,p-needtime);p=p-next;}printf(\n开始运行时间\t);p=head;while(p!=NULL){printf(%d\t,p-starttime);p=p-next;}p=head;printf(\n完成时间\t);while(p!=NULL){printf(%d\t,p-finishtime);p=p-next;}p=head;printf(\n周转时间\t);while(p!=NULL){printf(%0.1f\t,p-roundtime);p=p-next;}printf(%0.1f\n,avgroundtime);p=head;printf(带权周转时间\t);while(p!=NULL){//printf(%0.1f\t,p-roundtime);printf(%0.1f\t,p-weightroundtime);p=p-next;}printf(%0.1f\n,avgweightroundtime);dayin();printf(平均周转时间为%0.1f\n,avgroundtime);printf(平均带权周转时间为%0.1f\n,avgweightroundtime);dayin();}voiddayin(){printf(---------------------------------------------------------------------------\n);}voidmain()//mian函数{dayin();printf(\t\t先来先服务优先调度算法和短进程优先调度模拟实现\n\n);dayin();getInfo();printf(\t\t先来先服务进程优先调度模拟\n);fcfs();dayin();//将总时间置为零sumroundtime=0,sumweightroundtime=0;display();printf(\t\t短进程优先调度模拟\n);spf();display();}实验要求:1、运行程序并分析结果。2、理解实验源程序,增加其他调度算法实现,改进实验源程序。
本文标题:实验六-进程调度算法模拟实现
链接地址:https://www.777doc.com/doc-4834392 .html