您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 磁盘调度算法代码-(2)
磁盘调度算法一.需求分析编译程序运用磁盘的四种调度算法实现对磁盘的调度,四种算法分别为先来先服务(FCFS)算法,最短寻道时间优先(SSTF)算法,扫描调度(SCAN)算法,循环扫描(C-SCAN)算法。二.总体设计及分类简介磁盘调度中常用的有四种算法,功能分别如下:1.先来先服务(FCFS)算法。即先来的请求先被响应。FCFS策略看起来似乎是相当公平的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候FCFS也被看作是最简单的磁盘调度算法。2.最短寻道时间优先(SSTF)算法。要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。3.扫描调度(SCAN)算法。该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。4.循环扫描(C-SCAN)算法。当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程。三.目的1.熟悉并掌握磁盘管理系统的设计方法,加深对所学各种磁盘调度算法及其算1法的特点的了解。2.掌握磁盘调度的基本概念,比较各种磁盘调度算法的优劣四.要求从课程设计的目的出发,通过设计工作的各个环节,达到以下设计要求:1.对系统进行功能模块分析、控制模块分析正确;2.系统设计要实用;3.编程简练,可用,功能全面,具有较好的健壮性;4.说明书、流程图要清楚。五.详细设计及算法流程图1.总流程图输入磁道的个数输入所需功能的前置编号开始输入数字为1~4?输入当前磁道号退出数字为0?输入错误结果显示结束22.先来先服务(FCFS)算法流程图开始sum=0,j,i,first=0,nowi=0;in;i++确定磁头所在位置计算sumi=0,j=1;jn;i++,j++first+=abs(a[j]-a[i])sum+=first+abs(now-a[0])移动的总磁道数结束33.最短寻道时间优先(SSTF)算法流程图开始for(i=0;in;i++)couta[i]”;sum=a[n-1]-now;i=0;in;i++j=i+1;jn;j++inttemp;intk=1;intnow,l,r;inti,j,sum=0;for(i=n-1;i=0;i--)couta[i];sum=now-a[0];递增顺序的磁道显示a[i]a[j]if(a[n-1]=now)if(a[0]=now)while(a[k]now)//while(l=0)&&(rn)移动的总道数结束44.扫描调度(SCAN)算法流程图for(j=i+1;jn;j++)按递增顺序排好的磁道for(i=0;in;i++)inta[],intn开始for(i=0;in;i++)if(a[n-1]=now)if(a[0]=now)Intd;while(a[k]now)循环确定磁头访问的方向移动的总道数结束循环循环55.循环扫描(C-SCAN)算法流程图inta[],intnfor(i=0;in;i++)循环for(i=0;in;i++)循环按递增顺序排好的磁道for(i=0;in;i++)循环开始if(a[n-1]=now)if(a[0]=now)磁头位置在两侧磁道之间确定磁头访问的方向移动的总道数结束6附录:修改后的程序:#includeiostream#includectimeusingnamespacestd;voidFCFS(inta[],intn);voidSSTF(inta[],intn);voidSCAN(inta[],intn);voidCSCAN(inta[],intn);intmain(){intn;//磁道的个数ints;//功能号cout请输入当前磁道的个数:endl;cinn;int*a=newint[n];cout输入磁道号为:;for(inti=0;in;i++){cina[i];couta[i];}coutendl;while(1){coutendl;cout┏━━━━━━━━━━━━━━━━━━━━━━━┓endl;cout┃磁盘调度算法功能列表┃endl;cout┠───────────────────────┨endl;cout┃1、先来先服务算法(FCFS)┃endl;cout┠───────────────────────┨endl;cout┃2、最短寻道时间算法(SSTF)┃endl;cout┠───────────────────────┨endl;cout┃3、扫描算法(SCAN)┃endl;cout┠───────────────────────┨endl;cout┃4、循环扫描算法(CSCAN)┃endl;cout┠───────────────────────┨endl;7cout┃0、退出┃endl;cout┗━━━━━━━━━━━━━━━━━━━━━━━┛endl;coutendl;cout请选择所需功能的前置编号:;cins;if(s4){cout数据输入有误!请重新输入:endl;}else{switch(s){case0:exit(0);break;case1:FCFS(a,n);break;case2:SSTF(a,n);break;case3:SCAN(a,n);break;case4:CSCAN(a,n);break;}}}return0;}//先来先服务调度算法(FCFS)voidFCFS(inta[],intn){intj,i,first=0,now;floatsum=0,m;cout请输入当前磁道号:;cinnow;//确定当前磁头所在位置cout磁盘调度顺序为:endl;for(i=0;in;i++)//按访问顺序输出磁道号{couta[i];}//计算sumfor(i=0,j=1;jn;i++,j++){first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离}sum+=first+abs(now-a[0]);coutendl;cout移动的总磁道数为:sumendl;8m=sum/n;cout平均寻道长度为:mendl;}//最短寻道时间算法(SSTF)voidSSTF(inta[],intn){inttemp;intk=1;intnow,l,r;inti,j;floatm,sum=0;//将磁道号按递增排序for(i=0;in;i++)for(j=i+1;jn;j++){if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}cout按递增顺序排好的磁道显示为:endl;for(i=0;in;i++){couta[i];//输出排好的磁道顺序}coutendl;cout请输入当前的磁道号:;cinnow;//确定当前磁头所在位置cout磁盘调度顺序为:endl;if(a[n-1]=now)//当前磁头位置大于最外围欲访问磁道{for(i=n-1;i=0;i--)couta[i];sum=now-a[0];}elseif(a[0]=now)//当前磁头位置小于最里欲访问磁道{for(i=0;in;i++)couta[i];sum=a[n-1]-now;}9else{while(a[k]now)//确定当前磁道在已排的序列中的位置{k++;}l=k-1;//在磁头位置的前一个欲访问磁道r=k;//磁头欲访问磁道while((l=0)&&(rn)){if((now-a[l])=(a[r]-now))//选择离磁头近的磁道{couta[l];sum+=now-a[l];now=a[l];l=l-1;}else{couta[r];sum+=a[r]-now;now=a[r];r=r+1;}}if(l=-1)//磁头位置里侧的磁道已访问完{for(j=r;jn;j++)//访问磁头位置外侧的磁道{couta[j];}sum+=a[n-1]-a[0];}if(r==n)//磁头位置外侧的磁道已访问完{for(j=k-1;j-1;j--)//访问磁头位置里侧的磁道{couta[j];}sum+=a[n-1]-a[0];}}coutendl;10cout移动的总道数为:sumendl;m=sum/n;cout平均寻道长度为:mendl;}//扫描算法(SCAN)voidSCAN(inta[],intn){inttemp;intk=1;intnow,l,r;inti,j;floatm,sum=0;for(i=0;in;i++)//对访问磁道按由小到大顺序排列输出for(j=i+1;jn;j++){if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}cout按递增顺序排好的磁道为:endl;for(i=0;in;i++){couta[i];}coutendl;cout请输入当前的磁道号:;cinnow;//以下算法确定磁道访问顺序if(a[n-1]=now)//磁头位置大于最外围欲访问磁道{for(i=n-1;i=0;i--)couta[i];sum=now-a[0];}elseif(a[0]=now)//磁头位置小于最里欲访问磁道{for(i=0;in;i++)couta[i];sum=a[n-1]-now;}11else//磁头位置在最里侧磁道与最外侧磁道之间{intd;while(a[k]now){//确定当前磁道在已排的序列中的位置k++;}l=k-1;//在磁头位置的前一个欲访问磁道r=k;//磁头欲访问磁道cout请输入当前磁头移动的方向(0表示向内,1表示向外):;cind;//确定磁头访问的方向cout磁盘调度顺序为:;if(d==0||d==1){if(d==0)//磁头向内{for(j=l;j=0;j--){couta[j];}for(j=r;jn;j++){couta[j];}sum=now-2*a[0]+a[n-1];}if(d==1)//磁头向外{for(j=r;jn;j++){couta[j];}for(j=l;j=0;j--){couta[j];}sum=2*a[n-1]-now-a[0];}}elsecout请输入0或1!endl;}coutendl;cout移动的总道数为:sumendl;m=sum/n;12cout平均寻道长度为:mendl;}//循环扫描算法(CSCAN)voidCSCAN(inta[],intn){inttemp;intnow,
本文标题:磁盘调度算法代码-(2)
链接地址:https://www.777doc.com/doc-4282549 .html