还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
操作系统课程设计报告题目磁盘调度算法_______院系信息学院班级:信管11-2姓名王裕辰学号1101051024指导教师赵华fori=j,l=0;icountjk;i++j++req[i]=mediamin[l];}else{〃向磁道号减少的方向访问,先访问小于Startnumber的磁道,再访问大于Startnumber的fori=0;ik;i++req[i]=mediamin[i];fori=k,l=0;icount,lj;i++,l++req口]二mediamax
[1];void CSANRequest*req,int count,int pRequest mediamax[Max],mediamin[Max];j=0;k=0;fori=0;icount;i++〃大于Startnumber的请求放入mediamax,小于的放入mediamin中ifreq[i J.getnumberS tartnumbermediamax[j++]=req[i];ifreq[i].getnumberStartnumber mediamin[k++]=req[i];ifp—1//向磁道号增加的方向访问ascmediamin,k;〃将小于Startnumber的磁道的请求按磁道号升序排序ascmediamax,j;〃将大于Startnumber的磁道的请求按磁道号升序排序fori=0;ij;i++req[i]=mediamax[i];fori=j,l=0;icountjk;i++,l++req[i]=mediamin[l];elsedecmediamin,k;〃将小于于Startnumber的磁道的请求按磁道号降序排序decmediamax,j;〃将大于Startnumber的磁道的请求按磁道号降序排序fori=0;ik;i++〃将请求重新排序req[i]=mediamin[i];fori=k,l=0;icountJj;i++,l++req[i]=mediamax
[1];
五、测试与数据分析选择FCFS算法,输入以下请求信息被访问的下一个磁道号移动距离(磁道数)5545583391918219072160701501038112184146可以得到先来先服务调度算法的平均寻道时间(应为
55.3)选择最短寻道时间调度算法,再次输入上述请求信息可以得到SSTF的平均寻道时间(应为
27.5)选择扫描算法,再次输入以上请求信息,选择向磁道号增加的方向访问,则得到扫描算法的平均寻道长度(应为
27.8)选择循环扫描算法,再次输入上述请求信息,选择向磁道号增加的方向访问,得到循环扫描算法的平均寻道时间(应为
35.8)将上述四个调度算法得到的平均寻道时间进行比较,可以对这四种算法的性能进行分析和比较,对这四个磁盘调度算法有了更深入的理解
六、完成的情况、简要的使用说明本程序经过了调试,能够正常运行,并能够得到正确的结果但使用时应注意以下几个问题
1、选择调度算法的时候只能输入
0、
1、
2、
3、4这五个数字,若输入其它字符将造成程序进入死循环
2、进行扫描算法和循环扫描算法时,选择访问方向只能为1或2,若输入其它字符将造成程序进入死循环
3、在输入请求信息之前,应确定请求的数目,并输入
4、本程序需要逐个输入请求的信息,对于请求数目比较多的时候会花费较长的时间故本程序最好用于请求数目较少的情况
5、程序中的开始磁道号(Startnumber)为常量,用户无法输入但可以在程序代码中进行修改
七、结果分析运行程序界面如如下图所示课程设计磁空调团C:\Users\WYC\Desktop\OS DISKDipatch\Debug\DISKDipatch.exB磁盘调度算法工.走来先服务.曩短寻遵贬间优先
2.扫焉算法口靠环扫描算法
34.退出0请输入你选择的调度算法选择1,输入五测试与数据分析中的数据,得到如下所示课程设计磁空调团■C:\Users\WYC\Desktop\OS DISKDipatch\Debug\DISKDipatch.exB下一个磁道号移动距离(磁道数)
554535819392118729070160101501123814618455.3333平均寻道长度为磁盘调度算法.最短寻道时间优先
2.循环扫描算法4请输入你选择的调度算法:选择2,再次输入上述数据,得到如下所示选择3,再输入上述数据,选择向磁道号增加的方向访问,得到如下所示选择4,输入上述数据,选择向磁道号增加的方向访问,得到如下所示
八、总结本程序的最大特色为用户可以循环不断地选择调度算法,输入请求,得到每种算法的调度结果,以便用户可以对不同的磁盘调度算法进行比较和分析本程序能够模拟四种磁盘调度算法,计算出每个请求的移动距离和每种算法的访问顺序、平均寻道长度,便于加深对磁盘调度过程的理解,也能够更好地对四种算法的性能进行较为全面的分析本次课程设计首先让我对课本上的知识掌握的更加牢固,通过自己编写算法,模拟了磁盘调度过程,不但提高了我的编程能力,而且增强了我分析问题、解决问题的能力本程序由自己独立设计完成,虽然其间遇到了很多问题,但自己都能够顺利地解决,通过这个过程,感觉自己收获了很多在一开始做课程设计的时候,感觉无从下手,不知所措,毫无头绪,自己想起什么就写什么后来,我对课本上算法的描述仔细分析和理解,逐渐有了思路首先将程序的大致流程进行了规划和设计,然后将程序流程进行模块划分,接下来对每个模块进行分析,编写每个模块的代码最后所有模块完成后,将所有模块连接起来放入一个程序中,进行调试,直到程序没有错误,能够正确运行并能够得到正确的结果
九、参考文献[11汤小丹等计算机操作系统西安电子科技大学出版社
2007.5
[2]杜茂康等C++面向对象程序设计电子工业出版社
2011.7
一、概述本次设计的程序主要功能是模拟访问磁盘的过程,实现先来先服务调度算法、最短寻道时间调度算法、扫描算法、循环扫描算法四个磁盘调度算法,并根据输入的数据和所选择的调度算法输出每种调度算法的磁盘访问顺序,计算并输出四个算法的平均寻道长度本程序主要实现磁盘访问的顺序,输出四种不同的磁盘调度算法的磁盘访问结果,并计算出各自的平均寻道长度以此来对四种调度算法的性能进行评价
二、设计的基本概念和原理、基本概念11当前磁道号磁头当前时刻所在磁盘的磁道编号2被访问的下一个磁道号需要访问的下一个磁盘的磁道编号3移动距离磁头从当前磁道移动到被访问的下一个磁道号所需移动的磁道数、基本原理21先来先服务FCFS,First ComeFirst Served按照进程请求访问磁盘的先后次序进行从小到大排序,每次访问最先请求访问的磁道这样是每个进程的请求都能够依次地得到处理,不会出现某一进程的请求长期得不到满足的情况_2最短寻道时间优先SSTF,Shortest SeekTime First要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短磁头每次都移动到距离当前磁道距离最小的磁道上3扫描算法SCAN将请求访问的磁道号进行排序升序或降序,磁头按照磁道号从大到小或从小到达的顺序访问磁盘4循环扫描算法CSCAN磁头从当前磁道从里向外或从外向里访问磁道,当访问到最外或最里的磁道并访问后,磁头立即返回最里的或最外的欲访问的磁道,即最小或最大的磁道号紧接着最大或最小磁道号构成循环,进行循环扫描
三、总体设计本程序才用了结构化程序设计方法,将程序进行模块化处理首先将进程访问磁盘的请求抽象为一个类,用用户所输入的数据来把每个对象来初始化然后分块地调用不同的函数实现不同的调度算法本程序包括以下三个模块
(1)预定义及进程类定义模块定义程序所用到的头文件和常量定义请求类的类成员,成员函数以及输出请求类的类成员的输出函数
(2)主程序模块包括以下五个步骤
①选择进程调度算法
②输入请求
③调用所选的磁盘调度算法
④计算每个请求的移动距离
⑤输出磁盘访问顺序和每个请求的移动距离,计算并输出所选算法的平均寻道长度
(3)其它函数模块定义了四种调度算法和程序中调用的其他函数程序流程图如下图所示
四、详细设计每个模块的代码及分析如下、预定义及进程类定义模块1#include stdafx.h#include iostream#include cmath#include iomanipusing namespacestd;#define Startnumber100〃开始访问的磁道号#define Max100〃进程最大值class Requestprivate:int number,distance,difference;//number-被访问的下一个磁道号distance-移动距离difference--被访问的下一个磁道与当前磁道的距离public:int getnumber//返回被访问的下一个磁道号return number;}_int getdistance//返回移动距离return distance;int getdifference〃返回I被访问的下一个磁道与当前磁道的距离return difference;void setnumberintt〃设置被访问的下一个磁道号{number=t;}void setdistanceintt〃设置移动距离distance=t;}void setdifferenceint〃设置被访问的下一个磁道与当前磁道的距离differenced;void showconst〃输出被访问的下个磁道号和移动距离cout«setw17«number«setw6«distance«endl;};、主程序模块2int mainintargc,char*argv[]int i,c,num,option,choice;double averdis;//平均寻道长度Request request[Max];〃请求数组存放请求whilelcout«磁盘调度算法n«endl«endl;cout«H
1.先来先服务
2.最短寻道时间优先n«endl;cout«n
3.扫描算法
4.循环扫描算法”endl;cout«n
0.退出n«endl;cout«endl;cout”请输入你选择的调度算法”;cin»choice;//输入选择的调度算法ifchoice==0return0;elsecoutv〈”请输入请求数量”;cin»c;fori=0;ic;i++〃输入请求中的数据并初始化请求数组coutvv”请输入第vvi+lvv”个请求vvendl;cout”被访问的下一个磁道号”endl;cin»num;request[i].setnumbernum;ifchoice-lFCFSrequest,c;〃调用先来先服务ifchoice==2SSTFrequest,c;〃调用SSTFFCFSrequest,c;〃调用先来先服务计算移动距离ifchoice==3||choice==4〃若选择SCAN或CSCAN则需要选择访问方向coutv”选择访问方向n«endl;cout«”l,向磁道号增加方向
2.向磁道号递减方向vendl;你的选择是”;COUtVVcin»option;〃选择访问方向ifchoice==3SCANrequest,c,option;//调用SCANifchoice==4CSANrequest,c,option;〃调用CSCANFCFSrequest,c;〃调用先来先服务计算移动距离averdis=calcuaveragerequest,c;//计算平均寻道长度cout«setw20下一个磁道号vsetw6移动距离磁道数”《endl;fori=0;ic;i++〃输出调度结果和访问顺序request[i].show;cout“平均寻道长度为”;cout«averdis«endl;//输出平均寻道长度return0;、其它函数模块3void FCFSRequest*req,int count{〃先来先服务int i,currentnumber;fori=0;icount;i++ifi==0〃第一个请求的移动距离为它的磁道号与Startnumber的差req[i].setdistanceabsreq[i].getnumber-Startnumber;currentnumber=req[i].getnumber;}else//其他请求的移动距离为其磁道号与上一个请求磁道号的差req[i].setdistanceabsreq[i].getnumber-currentnumber;currentnumber=req[i].getnumber;}double calcuaverageRequest*req,int count//求平均寻道长度int i;double aver;aver=0;fori=0;icount;i++aver+=req[i].getdistance;}aver=aver/count;return aver;void ascRequest*req,int count//按磁道号递增排序int ij;Request temp;fori=0;icount;i++forj=i;jcount;j++ifreq[j].getnumberreq[i].getnumbertemp=req[j];req[j]=req[i];req[i]=temp;}void decRequest*req,int count//按磁道号递减排序int ij;Request temp;fori=0;icount;i++forj=i;jcount;j++ifreq[j].getnumberreq[i].getnumbertemp=req[j];req[j]=req[i];req[i]=temp;}}void SSTFRequest*req,int count{//最短寻道时间优先int i,currentnumber,j,k,min,flagmin[Max],flag;Request mediareq[Max];fori=0;icount;i++flagmin[i]=O;currentnumber=Startnumber;k=0;fori=0;icount;i++〃求所有磁道号与当前磁道的差forj=0;jcount;j++req[j].setdifferenceabsreq[j].getnumber-currentnumber;〃找磁道差的最小值,并把此请求放入中间数组中,其磁道作为当前磁道forj=0;jcount;j++〃每次将没有访问的磁道的磁道差作为最小值ifflagmin[j]~Omin=req|j].getdifference;;flag=j break;}forj=0;j count;j++〃找磁道差的最小值ifreq[j].geMifferenceminflagmin[j]==O〃将磁道差小于min且没有访问的磁道差作为最小值min=req[j].getdifference;flag=j;//flag记录磁道差最小的请求号}flagmin[flag]=l;mediareq[k++]=req[flag];〃找到的请求放入中间数组中currentnumber=req[flag].getnumber;//磁道号作为当前磁道fori=0;icount;i++req[i]=mediareq[i];void SCANRequest*req,int count,int p{//扫描算法int i,j,k,l;Requestmediamax[Max],mediamin[Max];j=0;k=0;fori=0;ivcount;i++〃大于Startnumber的请求放入mediamax,小于的放入mediamin中ifreq[i].getnumberStartnumbermediamax[j++]=req[i];ifreq[iJ.getnumberStartnumbermediamin[k++]=req[i];}ascmediamax,j;decmediamin,k;ifp==l{//向磁道号增加的方向访问,先访问大于开始磁道号的磁道,再访问小于Startnumber的fori=0;ij;i++req[i]=mediamax[i];。