代码改变世界

磁盘调度管理

2017-11-18 22:34  沈橙Anei  阅读(1336)  评论(0编辑  收藏  举报

磁盘调度管理

一、设计目的:

加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。

二、设计内容:

通过编程实现不同磁盘调度算法。

设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

常用的磁盘调度算法简介如下,请在最短寻道优先算法SSTF、扫描算法SCAN、循环扫描算法CSCAN中任意选择两种实现,并对算法性能进行分析对比。

三、开发环境

windows环境,VC6.0平台。

四、分析设计

<一>实验原理

  1. 最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
  2. 扫描算法SCAN:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。

<二>程序结构

输入磁道个数,选择寻道算法

0:退出

1:SSTF最短寻道优先算法

2:SCAN扫描算法

附录、源程序清单

#include<iostream>

#include<ctime>

using namespace std;

void SSTF(int a[],int n);

void SCAN(int a[],int n);

int main()

{

int n;    //磁道个数

int s;     //功能号

cout<<"请输入当前磁道个数,按Enter显示生成的随机磁道号:"<<endl;

cin>>n;

int *a=new int[n];

cout<<"生成磁道号为";

srand((unsigned)time(NULL));        //给srand提供一个种子,它是unsigned int类型,取值范围0-65565

    for(int i=0;i<n;i++){

a[i]=(rand()%200)+1;          //rand根据srand种子值返回一个随机数

cout<<a[i]<<" ";

}

cout<<endl;

while(1){

cout<<"请选择算法"<<endl;

cout<<"0:退出  1:SSTF  2:SCAN"<<endl;

cin>>s;

if(s>4){

cout<<"输入有误,请重新输入"<<endl;

}

else{

switch(s){

case 0:exit(0);

case 1:SSTF(a,n);break;

case 2:SCAN(a,n);break;

}

}

}

return 0;

}

 

//最短寻道时间算法(SSTF)

void SSTF(int a[],int n) {  

int temp;

int k=1;

int now,l,r;

int i,j,sum=0;  //将磁道号按递增排序,冒泡排序

for(i=0;i<n;i++)

for(j=i+1;j<n;j++) {    

if(a[i]>a[j])   {    

temp=a[i];   

a[i]=a[j];   

a[j]=temp;   

}

}  

cout<<"按递增顺序排好的磁道显示为:"<<endl;

for( i=0;i<n;i++) {  

cout<<a[i]<<" ";         //输出排好的磁道顺序

}

cout<<endl;  

now=rand()%200;

cout<<"当前磁道为"<<now<<endl;

cout<<"磁盘调度顺序为:"<<endl;  

if(a[n-1]<=now){         //当前磁头位置大于最外围欲访问磁道     

for(i=n-1;i>=0;i--)   

cout<<a[i]<<" ";   

sum=now-a[0];

}

else    if(a[0]>=now){           //当前磁头位置小于最里欲访问磁道    

for(i=0;i<n;i++)   

cout<<a[i]<<" ";

sum=a[n-1]-now;   

}   

else   {      

while(a[k]<now){          //当前磁道在已排的序列中的位置

 k++;  

}       

l=k-1;            //在磁头位置的前一个欲访问磁道

r=k;                 //磁头欲访问磁道       

while((l>=0)&&(r<n))  {       

if((now-a[l])<=(a[r]-now)){//选择离磁头近的磁道         

cout<<a[l]<<" ";       

sum+=now-a[l];       

now=a[l];       

l=l-1;  

}     

else     {      

cout<<a[r]<<" ";     

sum+=a[r]-now;     

now=a[r];     

r=r+1;  

}   

}

if(l==-1){//磁头位置里侧的磁道已访问完      

for(j=r;j<n;j++){//访问磁头位置外侧的磁道       

cout<<a[j]<<" ";   

}    

sum+=a[n-1]-a[0];   

}  

if(r==n){//磁头位置外侧的磁道已访问完   

for(j=k-1;j>-1;j--){ //访问磁头位置里侧的磁道                            

cout<<a[j]<<" ";            

}             

sum+=a[n-1]-a[0];

}   

}    

cout<<endl;    

cout<<"移动的总道数为:"<<sum<<endl;