您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 作业调度算法模拟-实验报告
作业调度算法模拟一.课题内容和要求常见的作业调度算法有先来先服务算法、最短作业优先算法、响应比优先调度算法。(1)参考操作系统教材理解这3种算法。(2)实现这3个算法。(3)已知若干作业的到达时间和服务时间,用实现的算法计算对该组作业进行调度的平均周转时间和平均带权周转时间。(4)作业的到达时间和服务时间可以存放在文本文件中。(5)设计简单的交互界面,演示所设计的功能。(可以使用MFC进行界面的设计)二.需求分析classJob//作业类{public:intID;//作业编号Timeenter;//进入时间intrequesttime;//估计运行时间intpriority;//优先数Timestart;//开始时间Timeend;//结束时间intTtime;//周转时间doubleWTtime;//带权周转时间};这个模块是设计作业结构(本程序是用的类Job)包括作业编号,进入时间,估计运行时间,优先数,开始时间,结束时间,周转时间,带权周转时间等。classschedule//调度类{private:intsize;//作业数Job*job;//作业数组int*r;//排序用数组intDiffer(Timet1,Timet2)//求两个时刻间的时间差{intborrow=(t2.minutet1.minute)?1:0;return((t2.hour-t1.hour-borrow)*60+(borrow*60+t2.minute-t1.minute));}这个模块是调度结构本程序为类scheduleb包括作业数,作业数组,排序用数组。voidFCFS()//先来先服务(FirstComeFirstServe)这个模块模拟实现算法先来先服务(FCFS)是按照各个作业进入系统的自然次序来调度算法。按照作业提交的先后次序分派CPU,当前作业或进程占用CPU,知道执行完成或阻塞,才出让CPU。在作业或进程被唤醒后,并不立即恢复执行,通常等到当前作业或进程出让CPU。voidSJF()//短作业优先(ShortestJobFirst)这个模块模拟实现短作业优先,按照作业运行时间从低到高排序,优先处理短作业。所谓的短作业并不是指物理作业的长短,而是作业的运行时间短。voidHPF()//基于外部优先数(HighestPriorityFirst)这个模块模拟实现优先调度并处理优先数最高的作业。本程序仅针对外部优先数,即用户规定优先数。voidHRN()//最高响应比优先(HighestResponse_ratioNext)这个模块模拟实现优先处理并处理响应比最高的作业。要通过一个循环找到一个响应比响应比较高的作业。R=作业周转时间/作业处理时间。三.概要设计否是开始初始化所有的作业根据算法调度一个作业作业是否处理完计算相关数据并输出取下一个作业地址结束此程序设计作业结构(本程序为类Job),包括作业编码、进入时间、估计运行时间、优先数、开始时间、结束时间、周转时间和带权周转时间等;调度结构(本程序为类schedule),包括作业数、作业数组以及排序用的数组等。模拟实现作业调度算法,包括:FCFS(先来先服务算法)、SJF(短作业优先算法)、HRN(最高响应比优先算法)、HPF(基于优先数调度算法)。四.详细设计#includeiostream#includefstream#includeiomanipusingnamespacestd;constintdefMaxJobNumber=10;//作业数量的最大值头文件分别定义输入输出流,iomanip定义关于cincout的调用,以及sew函数的调用,定义一个作业数量的最大值的常量。classTime//时间类{public:inthour;intminute;};定义一个时间类,包括小时和分钟。classJob//作业类{public:intID;//作业编号Timeenter;//进入时间intrequesttime;//估计运行时间intpriority;//优先数Timestart;//开始时间Timeend;//结束时间intTtime;//周转时间doubleWTtime;//带权周转时间};定义一个作业类,定义作业编号,进入时间,估计运行时间,优先数,开始时间,结束时间,周转时间,带权周转时间的变量。classschedule//调度类{private:intsize;//作业数Job*job;//作业数组int*r;//排序用数组intDiffer(Timet1,Timet2)//求两个时刻间的时间差{intborrow=(t2.minutet1.minute)?1:0;return((t2.hour-t1.hour-borrow)*60+(borrow*60+t2.minute-t1.minute));}这段代码定义了一个调度类包括作业数,作业数组,排序用数组、用intDiffer球两个时刻间的时间差。voidshow()//输出计算结果{doubleaverageTime=0.0,//平均周转时间wAverageTime=0.0;//带权平均周转时间cout编号进入时间运行时间优先数开始时间结束时间周转时间带权周转时间endl;for(inti=0;isize;i++){coutsetw(4)job[i].IDsetw(7)job[i].enter.hour:;if(job[i].enter.minute10)cout0job[i].enter.minute;elsecoutjob[i].enter.minute;coutsetw(10)job[i].requesttimesetw(8)job[i].prioritysetw(7)job[i].start.hour:;if(job[i].start.minute10)cout0job[i].start.minute;elsecoutjob[i].start.minute;coutsetw(7)job[i].end.hour:;if(job[i].end.minute10)cout0job[i].end.minute;elsecoutjob[i].end.minute;coutsetw(10)job[i].Ttimesetw(14)job[i].WTtimeendl;averageTime+=job[i].Ttime;wAverageTime+=job[i].WTtime;}cout作业平均周转时间T=averageTime/size分钟endl;cout作业带权平均周转时间W=wAverageTime/sizeendlendl;}Show输出计算结果。代码首先给初始化平均周转时间和平均带权周转时间都为0.0,然后分别显示编号、进入时间、运行时间、优先数、开始时间、结束时间、周转时间、带权周转时间。然后进入一个for循环,调用sew为作业号,进入时间的显示分派间距。如果进入时间小于10,输出0和进入时间,否则输出进入时间,然后输出需求时间,优先数,开始时间(小时),如果开始时间(分钟)小于10,同理输出0和开始时间。以下类同。分别输出结束时间,平均周转时间,平均带权周转时间。For循环结束后计算作业平均周转时间和作业带权周转时间。voidreadFile()//从文件读信息{ifstreamtxtfile;txtfile.open(a.txt);if(!txtfile){cerr文本文件打开失败!endl;exit(1);}inti=0;intentertime;while(!txtfile.eof()){txtfilejob[i].IDentertimejob[i].requesttimejob[i].priority;job[i].enter.hour=entertime/100;job[i].enter.minute=entertime%100;i++;size++;}txtfile.close();此代码段定义的是文件读取函数,并且计算出开始的小时和分钟。该函数能够直接读取一个文件,不需要在输入进去。通过i使整个进入时间分别算出小时和分钟。voidFCFS()//先来先服务(FirstComeFirstServe){inthour,minute,carry;cout先来先服务作业调度算法计算结果:endl;job[0].start=job[0].enter;//第一道作业到达的开始时间hour=job[0].requesttime/60;minute=job[0].requesttime%60;job[0].end.minute=(job[0].start.minute+minute)%60;carry=(job[0].start.minute+minute)/60;job[0].end.hour=job[0].start.hour+hour+carry;job[0].Ttime=job[0].requesttime;job[0].WTtime=((double)job[0].Ttime)/job[0].requesttime;for(inti=1;isize;i++){job[i].start=job[i-1].end;hour=job[i].requesttime/60;minute=job[i].requesttime%60;job[i].end.minute=(job[i].start.minute+minute)%60;carry=(job[i].start.minute+minute)/60;job[i].end.hour=job[i].start.hour+hour+carry;job[i].Ttime=Differ(job[i].enter,job[i].end);job[i].WTtime=((double)job[i].Ttime)/job[i].requesttime;}show();}此代码段定义一个先来现服务的函数,第一道作业开始时间开始计算,分别计算出开始时间的小时和分钟。第一道作业的结束时间(分钟)为第一道作业的开始时间加上估计运行的时间对60取余。同理算出开始时间(小时),第一道作业的周转时间等于估计运行时间,第一道作业的带权周转时间等于周转时间除以需求时间。然后进入一个for循环算出每一个作业的结束时间,周转时间,带权周转时间。voidSJF()//短作业优先(ShortestJobFirst){inthour,minute,carry;cout短作业优先作业调度算法计算结果:endl;job[0].start=job[0].enter;hour=job[0].requesttime/60;minute=job[0].requesttime%60;job[0].end.minute=(job[0].start.minute+minute)%60;carry=(job[0].start.minute+minute)/60;job[0].end.hour=job[0].start.hour+hour+carry;job[0].Ttime=job[0].requesttime;job[0].WTtime=((double)job[0].Ttime)/job[0].requesttime;for(inti=1;isize;i++)r[i]=i;for(i=1;isize-1;i++)//按照作业运行时间从低到高排序{intindex=i;for(intj=i+1;jsize;j++)if(job[r[j]].requesttimejob[r[index]].requesttime)index=j;if(index!=i){intw=r[i
本文标题:作业调度算法模拟-实验报告
链接地址:https://www.777doc.com/doc-5422262 .html