磁盘调度算法通常有FCFS、SSTF、SCAN、CSAN这四种算法,以下是这种四种方法的总和:
#include<iostream>
using namespace std;
#include<math.h>
#include<iomanip>
int FF[10]={55,58,39,18,90,160,150,38,184};
int F[10];
int z[10]={100};
int Y[9];
float a_l=0;
void FCFS()
{
int i=0;
int temp=100;
while(i<9)
{
Y[i]=fabs(temp-F[i]);
temp=F[i];
i++;
}
cout<<"从100#磁道开始"<<endl;
cout<<"访问到的磁道号"<<setw(10)<<"移动距离"<<endl;
for(i=0;i<9;i++)
{
cout<<setw(10)<<F[i]<<setw(10)<<Y[i]<<endl;
a_l+=Y[i];
}
cout<<"平均寻道距离:"<<setw(10)<<a_l/9<<endl;}
void SSTF()
{
int temp,temp1,k,w;
int j=9;
int a=0;
int i;
while(j>0)
{
temp=fabs(z[a]-F[0]);
k=temp;
int c=0;
for(i=0;i<j;i++)
{
temp1=fabs(z[a]-F[i]);
if((k-temp1)<0)
{k=k;w=c;}
else
{k=temp1;w=i;c=i;}
}
Y[a]=k;
a++;
z[a]=F[w];
for(w;w<9;w++)
{
F[w]=F[w+1];
}
j--;
}
int zz[9];
for(a=0;a<9;a++)
{zz[a]=z[a+1];}
cout<<"从100#磁道开始"<<endl;
cout<<"访问到的磁道号"<<setw(10)<<"移动距离"<<endl;
a_l=0;
for(a=0;a<9;a++)
{cout<<setw(10)<<zz[a]<<setw(10)<<Y[a]<<endl;a_l+=Y[a];}
cout<<"平均寻道距离:"<<setw(10)<<a_l/9<<endl;}
void SCAN()
{
int aa[9],bb[9];
int start=z[0];
int i=0,j=0;
int ii=0,jj=0;
int temp;
int FF[9];while(i<9)
{
if((F[i]-start)>0)
{aa[ii]=F[i];ii++;i++;}
else {bb[jj]=F[i];jj++;i++;}
}
for(i=0;i<(ii-1);i++)
{ for(j=i;j<ii;j++)
{
if(aa[i]>aa[j])
{
temp=aa[i];
aa[i]=aa[j];
aa[j]=temp;}
}
}
for(i=0;i<(jj-1);i++)
{
for(j=i;j<jj;j++)
{ if(bb[i]<bb[j])
{temp=bb[i];
bb[i]=bb[j];
bb[j]=temp;}
}
}
temp=z[0];
for(i=0;i<ii;i++)
{
Y[i]=aa[i]-temp;
temp=aa[i];
FF[i]=aa[i];}
for(j=0;j<jj;j++)
{
Y[i]=fabs(bb[j]-temp);
temp=bb[j];
FF[i]=bb[j];
i++;
}
cout<<"从100#磁道开始,磁头方向为自外向里"<<endl;
cout<<"访问到的磁道号"<<setw(10)<<"移动距离"<<endl;
a_l=0;
for(i=0;i<9;i++)
{
cout<<setw(10)<<FF[i]<<setw(10)<<Y[i]<<endl;
a_l+=Y[i];
}
cout<<"平均寻道距离:"<<setw(10)<<a_l/9<<endl;}
void CSCAN()
{
int aa[9],bb[9];
int start=z[0];
int i=0,j=0;
int ii=0,jj=0;
int temp;
int FF[9];
while(i<9)
{
if((F[i]-start)>0)
{aa[ii]=F[i];ii++;i++;}
else {bb[jj]=F[i];jj++;i++;}
}
for(i=0;i<(ii-1);i++)
{ for(j=i;j<ii;j++)
{
if(aa[i]>aa[j])
{
temp=aa[i];
aa[i]=aa[j];
aa[j]=temp;}
}
}
for(i=0;i<(jj-1);i++)
{
for(j=i;j<jj;j++)
{ if(bb[i]>bb[j])
{temp=bb[i];
bb[i]=bb[j];
bb[j]=temp;}
}
}
temp=z[0];
for(i=0;i<ii;i++)
{
Y[i]=aa[i]-temp;
temp=aa[i];
FF[i]=aa[i];}
for(j=0;j<jj;j++)
{
Y[i]=fabs(bb[j]-temp);
temp=bb[j];
FF[i]=bb[j];
i++;
}
cout<<"从100#磁道开始,磁头方向为自外向里"<<endl;
cout<<"访问到的磁道号"<<setw(10)<<"移动距离"<<endl;
a_l=0;
for(i=0;i<9;i++)
{
cout<<setw(10)<<FF[i]<<setw(10)<<Y[i]<<endl;
a_l+=Y[i];
}
cout<<"平均寻道距离:"<<setw(10)<<a_l/9<<endl;}
void main()
{
int n,i;
do
{
for(i=0;i<9;i++)
F[i]=FF[i];
cout<<"请求访问的磁道号依次为:";
for(i=0;i<9;i++)
cout<<F[i]<<" ";
cout<<endl;
cout<<"请选择算法"<<endl;
cout<<" 1-FCFS "<<endl;
cout<<" 2-SSTF "<<endl;
cout<<" 3-SCAN "<<endl;
cout<<" 4-CSCAN "<<endl;
cout<<" 0-exit "<<endl;
cin>>n;
switch(n)
{
case 1:{FCFS();break;}
case 2:{SSTF();break;}
case 3:{SCAN();break;}
case 4:{CSCAN();break;}
//case 0:exit;
}
}while(n!=0);
}