您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统作业调度实验
实验二作业调度一、实验名称作业调度算法的模拟实现二、实验目标作业调度又称宏观调度,其主要任务是对磁盘设备上大量的后备作业,以一定的原则进行挑选,给选中的作业分配内存等必须的资源,建立其相应的进程,让其投入运行。本实验要求学生用高级程序设计语言编写和调试一个简化的作业调度程序,模拟实现的调度算法包括:先来先服务调度算法,短作业优先调度算法,响应比高者优先调度算法等,并对这些算法的性能做比较和评价。以加深学生对作业、作业调度以及作业调度的各种算法的理解。三、实验环境要求Windows+VisualC++6.0;四、实验基本原理作业调度主要是完成作业从后备状态到执行状态的转变,以及从执行状态到完成状态的转变。(1)创建JCB(作业控制块):系统在作业进入后备状态时为每个作业创建一个作业控制块(JCB),从而使该作业可被调度程序感知。当该作业执行完毕进入完成状态时候,系统自动撤销其JCB并释放有关资源,进而撤销该作业。(2)按照作业调度算法,从后备队列中挑选一作业投入运行。作业调度程序为运行作业建立相应的进程,并分配资源。(3)主要的作业调度算法包括:先来先服务(FCFS)、短作业优先和最高响应比。(4)调度策略的指标:最常用的调度性能指标有,周转时间(带权)、吞吐率、响应时间以及设备利用率。五、数据结构设计(1)作业控制块,包括作业的基本信息描述。structtime//时间的数据结构{inthour;intminute;};structJob//作业{stringjobname;//作业名timeintime;//进入时间intruntime;//作业估计运行时间timestarttime;//作业开始时间timeendtime;//作业结束时间intcycletime;//作业周转时间floatcltime;//作业带权周转时间boolhaverun;//是否已运行};六、流程图图1作业调度算法流程图七、源代码#includeiostream#includestringusingnamespacestd;structtime//时间的数据结构{inthour;intminute;};structJob//作业{stringjobname;//作业名timeintime;//进入时间intruntime;//作业估计运行时间timestarttime;//作业开始时间timeendtime;//作业结束时间Y用户选择进入系统选择调度算法FCFS调度算法短作业优先响应比优先是E或e退出系统intcycletime;//作业周转时间floatcltime;//作业带权周转时间boolhaverun;//是否已运行};floatT=0;//作业平均周转时间floatW=0;//作业带权平均周转时间voidshowInput(Jobjob[],int&n)//输入提示{cout**********请按作业进入时间先后顺序输入*********endl;for(inti=0;in;i++){cout作业i+1:endl;cout作业名:;cinjob[i].jobname;cout作业进入时间:;scanf(%d:%d,&job[i].intime.hour,&job[i].intime.minute);cout作业估计运行时间:;cinjob[i].runtime;job[i].starttime.hour=0;job[i].starttime.minute=0;job[i].endtime.hour=0;job[i].endtime.minute=0;job[i].cycletime=0;job[i].cltime=0;job[i].haverun=false;//标记为未运行cout*********************endl;}}voidInit(Jobjob[],int&n)//初始化{for(inti=0;in;i++){job[i].starttime.hour=0;job[i].starttime.minute=0;job[i].endtime.hour=0;job[i].endtime.minute=0;job[i].cycletime=0;job[i].cltime=0;job[i].haverun=false;//标记为未运行}T=0;W=0;}voidshowTime(timetime)//显示时间{couttime.hour:time.minute;}inttimeDiff(timet1,timet2)//计算时间差,时间t1比t2大{returnt1.hour*60+t1.minute-(t2.hour*60+t2.minute);}timetimeAdd(timetime,intaddtime)//时间相加{time.hour+=addtime/60;time.minute+=addtime%60;if(time.minute=60){time.hour++;time.minute-=60;}returntime;}boolcomtime(timet1,timet2)//比较两个时间的大小,第一个大就返回TRUE{if(t1.hourt2.hour)returntrue;elseif(t1.hour==t2.hour&&t1.minute=t2.minute)returntrue;elsereturnfalse;}voidshowResult(Jobjob[],int&n)//显示结果{coutjobname\tintime\truntime\tsttime\tendtime\t周转时间(分钟)\t带权周转时间endl;cout*******************************************************************endl;for(inti=0;in;i++){coutjob[i].jobname\t;showTime(job[i].intime);cout\tjob[i].runtime\t;showTime(job[i].starttime);cout\t;showTime(job[i].endtime);cout\tjob[i].cycletime\t\tjob[i].cltimeendl;}cout作业平均周转时间:T=T/(n*1.0)endl;cout作业带权平均周转时间:W=W/(n*1.0)endl;}intminRuntime(Jobjob[],int&n,time&t)//找出作业中最短作业下标{intmin=-1;for(inti=0;in;i++){if(job[i].haverun==false&&comtime(t,job[i].intime)==true){min=i;break;}}for(intj=min+1;jn;j++)if(job[j].haverun==false&&job[j].runtimejob[min].runtime&&comtime(t,job[j].intime)==true)min=j;returnmin;}voidSJF(Jobjob[],int&n)//短作业优先作业调度{structtimet;job[0].starttime.hour=job[0].intime.hour;job[0].starttime.minute=job[0].intime.minute;job[0].endtime=timeAdd(job[0].starttime,job[0].runtime);job[0].haverun=true;job[0].cycletime=timeDiff(job[0].endtime,job[0].intime);job[0].cltime=job[0].cycletime*1.0/job[0].runtime;T+=job[0].cycletime;W+=job[0].cltime;t=job[0].endtime;while(minRuntime(job,n,t)!=-1){inti=minRuntime(job,n,t);if(comtime(job[i].intime,t))job[i].starttime=job[i].intime;elsejob[i].starttime=t;job[i].endtime=timeAdd(job[i].starttime,job[i].runtime);job[i].haverun=true;job[i].cycletime=timeDiff(job[i].endtime,job[i].intime);job[i].cltime=job[i].cycletime*1.0/job[i].runtime;T+=job[i].cycletime;W+=job[i].cltime;t=job[i].endtime;}}intFirstintime(Jobjob[],int&n)//找出作业中最先到的{intmin=-1;for(inti=0;in;i++){if(job[i].haverun==false){min=i;break;}}for(intj=min+1;jn;j++)if(job[j].haverun==false&&comtime(job[min].intime,job[j].intime))min=j;returnmin;}voidFCFS(Jobjob[],int&n)//先来先服务作业调度{structtimet;job[0].starttime.hour=job[0].intime.hour;job[0].starttime.minute=job[0].intime.minute;job[0].endtime=timeAdd(job[0].starttime,job[0].runtime);job[0].haverun=true;job[0].cycletime=timeDiff(job[0].endtime,job[0].intime);job[0].cltime=job[0].cycletime*1.0/job[0].runtime;T+=job[0].cycletime;W+=job[0].cltime;t=job[0].endtime;while(Firstintime(job,n)!=-1){inti=Firstintime(job,n);if(comtime(job[i].intime,t))job[i].starttime=job[i].intime;elsejob[i].starttime=t;job[i].endtime=timeAdd(job[i].starttime,job[i].runtime);job[i].haverun=true;job[i].cycletime=timeDiff(job[i].endtime,job[i].intime);job[i].cltime=job[i].cycletime*1.0/job[i].runtime;T+=job[i].cycletime;W+=job[i].cltime;t=job[i].endtime;}}voidmain(){cout请输入作业数:;intn;//作业数cinn;Job*job=newJob[n];if(n=0){cout输入不合法!;exit(-1);}else{showInput(job,n);coutendl;FCFS(job,n);cout先来先服务:endl;showResult(job,n);coutendl;Init(job,n);SJF(job,n);//短作业优先cout短作业优先:endl;s
本文标题:操作系统作业调度实验
链接地址:https://www.777doc.com/doc-1850698 .html