磁盘调度实验报告

武汉理工大学

实验课程名称       计算机操作系统      

开 课 学 院      计算机科学与技术学院  

指导老师姓名            蔡菁           

学 生 姓 名            常云鹏           

学生专业班级           计算机1304       

2015  —  2016  学年  第 一 学期

实验项目名称:磁盘调度

设计目的、功能与要求:

设计目的和功能:任选一种计算机高级语言编程模拟实现磁盘调度功能。

选择1-2种磁盘调度算法实现(先来先服务、最短寻道时间优先、电梯调度)

输入当前磁头的位置、磁头的方向、磁道访问请求序列等

能显示磁盘调度结果,并计算磁头移动的总磁道数

     

功能框图:

 

源代码:

       #include<stdio.h>

#include<stdlib.h>

#include<iostream.h>

#include<math.h>

#define maxnumber 1000

int decide(char str[]) //判断输入数据是否有效

{

       int i=0;

       while(str[i]!='\0')

       {

              if(str[i]<'0'||str[i]>'9')

              {

                     return 0;

                     break;

              }

              i++;

       }

       return i;

}

int trans(char str[],int a) //将字符串转换成数字

{

       int i;

       int sum=0;

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

       {

              sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));

       }

       return sum;

}

int *bubble(int cidao[],int m)

int i,j;

int t;

for(i=0;i<m;i++) //使用冒泡法按从小到大顺序排列

for(j=i+1;j<m;j++)

{

       if(cidao[i]>cidao[j])

       { 

              t=cidao[i];

              cidao[i]=cidao[j];

              cidao[j]=t;

       }

}

cout<<"排序后的磁盘序列为:";

for( i=0;i<m;i++) //输出排序结果

{

       cout<<cidao[i]<<" ";

}

cout<<endl;

return cidao;

void FCFS(int cidao[],int m) //磁道号数组,个数为m

{

       int n;//当前磁道号

       int sum=0; //总寻道长度

       int j,i;

       int b;

       char str[100];

       float ave; //平均寻道长度

       cout<<"磁盘请求序列为:";

       for( i=0;i<m;i++) //按先来先服务的策略输出磁盘请求序列

       {

              cout<<cidao[i]<<" ";

       }

       cout<<endl;

       cout<<"请输入当前的磁道号:"; 

B: cin>>str; //对输入数据进行有效性判断

   b=decide(str);

   if(b==0)

   {

          cout<<"输入数据的类型错误,请重新输入!"<<endl;

          goto B;

   }

   else 

          n=trans(str,b); //输入当前磁道号

   sum+=abs(cidao[0]-n); cout<<"磁盘扫描序列为:";

   for( i=0;i<m;i++) //输出磁盘扫描序列

   {

          cout<<cidao[i]<<" ";

   }

   for(i=0,j=1;j<m;i++,j++) //求平均寻道长度

   {

          sum+=abs(cidao[j]-cidao[i]);

          ave=(float)(sum);

   }

   cout<<endl;

   cout<<"总寻道长度:"<<ave<<endl;

}

void SSTF(int cidao[],int m)

{

       int r=1;

       int n,l,s;

       int i,j,sum=0;

       int a;

       char str[100];

       float ave;

       cidao=bubble(cidao,m); //调用冒泡排序算法排序

       cout<<"请输入当前的磁道号:"; 

C: cin>>str; //对输入数据进行有效性判断

   a=decide(str);

   if(a==0)

   {

          cout<<"输入数据的类型错误,请重新输入!"<<endl;

          goto C;

   }

   else 

          n=trans(str,a); //输入当前磁道号

   if(cidao[m-1]<=n) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务

   {

          cout<<"磁盘扫描序列为:";

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

                 cout<<cidao[i]<<" ";

          sum=n-cidao[0];

   }

   if(cidao[0]>=n) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务

   { cout<<"磁盘扫描序列为:";

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

          cout<<cidao[i]<<" ";

   sum=cidao[m-1]-n;

   }

   if(n>cidao[0]&&n<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者

   {

          cout<<"磁盘扫描序列为:";

          while(cidao[r]<n) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。

          {

                 r++;

          }

          l=r-1;

          s=r;

          while((l>=0)&&(s<m)) //当前磁道在请求序列范围内

          {

                 if((n-cidao[l])<=(cidao[s]-n)) //选择与当前磁道最近的请求给予服务

                 {

                        cout<<cidao[l]<<" ";

                        sum+=n-cidao[l];

                        n=cidao[l];

                        l=l-1;

                 }

                 else

                 {

                        cout<<cidao[s]<<" ";

                        sum+=cidao[s]-n;

                        n=cidao[s];

                        s=s+1;

                 }

          }

          if(l==-1) //磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道

          {

                 for(j=s;j<m;j++)

                 {

                        cout<<cidao[j]<<" ";

                 }

                 sum+=cidao[m-1]-cidao[0];

          }

          else //磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道

          {

                 for(j=l;j>=0;j--)

                 { cout<<cidao[j]<<" ";

                 }

                 sum+=cidao[m-1]-cidao[0];

          }

   }

   ave=(float)(sum);

   cout<<endl;

   cout<<"总寻道长度: "<<ave<<endl;

}

void SCAN(int cidao[],int m) //先要给出当前磁道号和移动臂的移动方向

{

       int r=1;

       int n,l,s,d;

       int i,j,sum=0;

       int a;

       char str[100];

       float ave;

       cidao=bubble(cidao,m); //调用冒泡排序算法排序

       cout<<"请输入当前的磁道号:";

D: cin>>str; //对输入数据进行有效性判断

   a=decide(str);

   if(a==0)

   {

          cout<<"输入数据的类型错误,请重新输入!"<<endl;

          goto D;

   }

   else 

          n=trans(str,a); //输入当前磁道号

   if(cidao[m-1]<=n) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先

   { 

          cout<<"磁盘扫描序列为:";

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

                 cout<<cidao[i]<<" ";

          sum=n-cidao[0];

   }

   if(cidao[0]>=n) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先

   { 

          cout<<"磁盘扫描序列为:"; 

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

                 cout<<cidao[i]<<" ";

          sum=cidao[m-1]-n; }

   if(n>cidao[0]&&n<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者

   {

          while(cidao[r]<n)

          {

                 r++;

          }

          l=r-1;

          s=r;

          cout<<"请输入当前移动臂的移动的方向 (1 表示向外 ,0表示向内) : ";

          cin>>d;

          if(d==0) //选择移动臂方向向内,则先向内扫描

          {

                 cout<<"磁盘扫描序列为:";

                 for(j=l;j>=0;j--)

                 {

                        cout<<cidao[j]<<" "; //输出向内扫描的序列

                 }

                 for(j=s;j<m;j++) //磁头移动到最小号,则改变方向向外扫描未扫描的磁道

                 {

                        cout<<cidao[j]<<" "; //输出向外扫描的序列

                 }

                 sum=n-2*cidao[0]+cidao[m-1];

          }

          else //选择移动臂方向向外,则先向外扫描

          {

                 cout<<"磁盘扫描序列为:";

                 for(j=s;j<m;j++)

                 {

                        cout<<cidao[j]<<" "; //输出向外扫描的序列

                 }

                 for(j=l;j>=0;j--) //磁头移动到最大号,则改变方向向内扫描未扫描的磁道

                 {

                        cout<<cidao[j]<<" ";

                 }

                 sum=-n-cidao[0]+2*cidao[m-1];

          }

   } 

   ave=(float)(sum);

   cout<<endl;

   cout<<"总寻道长度: "<<ave<<endl;

}

void CSCAN(int cidao[],int m)

{

       int r=1;

       int n,l,s;

       int i,j,sum=0;

       int a;

       char str[100];

       float ave;

       cidao=bubble(cidao,m); //调用冒泡排序算法排序

       cout<<"请输入当前的磁道号:"; 

E: cin>>str; //对输入数据进行有效性判断

   a=decide(str);

   if(a==0)

   {

          cout<<"输入数据的类型错误,请重新输入!"<<endl;

          goto E;

   }

   else 

          n=trans(str,a); //输入当前磁道号

   if(cidao[m-1]<=n) //若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务 

   {

          cout<<"磁盘扫描序列为:";

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

                 cout<<cidao[i]<<" ";

          sum=n-2*cidao[0]+cidao[m-1];

   }

   if(cidao[0]>=n) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先

   {

          cout<<"磁盘扫描序列为:";

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

                 cout<<cidao[i]<<" ";

          sum=cidao[m-1]-n;

   }

   if(n>cidao[0]&&n<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者

   {

          cout<<"磁盘扫描序列为:";

          while(cidao[r]<n) //单向反复地从内向外扫描

          {

                 r++;

          }

          l=r-1;

          s=r; for(j=s;j<m;j++)

          {

                 cout<<cidao[j]<<" "; //输出从当前磁道向外扫描的序列

          }

          for(j=0;j<s;j++) //当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道

          {

                 cout<<cidao[j]<<" ";

          }

          sum=2*cidao[m-1]+cidao[l]-n-2*cidao[0];

   }

   ave=(float)(sum);

   cout<<endl;

   cout<<"总寻道长度: "<<ave<<endl;

}

void main()

{

       int a; 

       int c; //菜单项

       int cidao[maxnumber];

       int i=0,count;

       char str[100];

       cout<<"请输入磁道序列(0结束):"<<endl;

A:cin>>str; //对输入数据进行有效性判断

  a=decide(str);

  if(a==0)

  {

         cout<<"输入数据的类型错误,请重新输入!"<<endl;

         goto A;//输入错误,跳转到A,重新输入

  } 

  else

         cidao[i]=trans(str,a);

  i++;

  while(cidao[i-1]!=0)

  {

         cin>>str; //对输入数据进行有效性判断

         a=decide(str);

         if(a==0)

                cout<<"输入数据的类型错误,请重新输入!"<<endl;

         else

         { 

                cidao[i]=trans(str,a);

                i++;

  }

}

  count=i-1; //要访问的磁道数

  cout<<"你输入的磁道序列为:";

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

  {

         cout<<cidao[i]<<" "; //输出磁道序列

  }

  cout<<endl;

  while(1)

  {

         cout<<endl;

         cout<<"********************************"<<endl;

         cout<<"*                              *"<<endl;

         cout<<"* 1.  先   来   先   服    务  *"<<endl;

         cout<<"* 2.  最 短 寻 道 时 间 优 先  *"<<endl;

         cout<<"* 3.  扫     描    调      度  *"<<endl;

         cout<<"* 4.  循     环    扫      描  *"<<endl;

         cout<<"* 5.  退                   出  *"<<endl;

      cout<<"*                              *"<<endl;

         cout<<"********************************"<<endl;

G:cout<<"请选择算法:";

F:cin>>str; //对输入数据进行有效性判断

  a=decide(str);

  if(a==0)

  {

         cout<<"输入数据的类型错误,请重新输入!"<<endl;

         goto F;//输入错误,跳转到F,重新输入

  } 

  else

         c=trans(str,a);

  if(c==5)

         break;

  if(c>5)

  {

         cout<<"数据输入错误!请重新输入"<<endl;

         goto G;

  }

  switch(c)

  {

  case 1: //使用FCFS算法

         FCFS(cidao,count);

         break;

  case 2: //使用SSTF算法

         SSTF(cidao,count);

         break;

  case 3: //使用SCAN算法

         SCAN(cidao,count);

         break;

  case 4: //使用CSCAN算法 CSCAN(cidao,count);

         break;

  }

  }

}

运行结果:

自我评价与总结:

通过本次的实验,我知道了怎样更好的将书本上的知识与实际结合起来,同时也发现了自身存在的许多不良习惯与毛病。我发现了我很多学习中的不足之处,本来开始的时候对磁盘调度问题不是很了解,对于代码无从下手。在网上查阅有关资料后,对这个问题有了自己的看法,也有了思路。 在试验过程中遇到了很多的问题,在与同学的共同探讨之下将问题结局,总之,这次实验让我学到了很多有用的东西。

相关推荐