磁盘调度实验报告

时间:2024.3.31

武汉理工大学

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

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

指导老师姓名            蔡菁           

学 生 姓 名            常云鹏           

学生专业班级           计算机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;

  }

  }

}

运行结果:

自我评价与总结:

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

更多相关推荐:
磁盘调度实验报告

操作系统实验报告课程名称计算机操作系统实验项目名称磁盘调度实验时间班级姓名学号实验目的对操作系统的磁盘调度基础理论和重要算法的理解加强动手能力实验环境PC机win7VisualC实验内容编程序实现下述磁盘调度算...

操作系统磁盘调度算法实验报告

目录目录11课程设计目的111编写目的12课程设计内容121设计内容131模块调用关系图34测试数据和结果75参考文献106总结101课程设计目的11编写目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模...

6.磁盘调度实验报告

1操作系统课程设计磁盘调度算法操作系统实验报告磁盘调度实验六磁盘调度算法一实验目的复习模拟实现一种磁盘调度算法进一步加深对磁盘调度效率的理解二实验属性该实验为设计性实验三实验仪器设备及器材普通PC386以上微机...

操作系统实验磁盘调度算法实验报告

安徽师范大学专业名称实验室实验课程实验名称姓名学号同组人员实验日期20xx614软件工程操作系统实验1234567891011121314151617

磁盘调度实验报告

计算机操作系统实验报告班级学号0800303226姓名罗院实验目的编程模拟实现磁盘调度的常用算法或调试分析相关磁盘调度程序加深对磁盘调度常用算法的理解和实现技巧实验内容1自定义磁盘调度相关的数据结构2依据先来先...

磁盘调度实验报告

一.课程设计目的和要求操作系统是计算机系统的一个重要系统软件。我们在本课程的实验过程中,了解实际操作系统的工作过程,在实践中加深对操作系统原理的理解。本实验设计的目的是通过设计一个磁盘调度模拟系统,以加深对FC…

磁盘调度算法 实验报告

操作系统实验报告实验三学生俞泽涛学号20xx06090131学院电气与信息工程学院系别计算机系专业网络工程实验时间20xx年5月21日报告时间20xx年5月25日一实验内容模拟电梯调度算法实现对磁盘的驱动调度二...

驱动调度实验报告

南通大学计算机科学与技术学院操作系统驱动调度实验报告班级计091姓名学号指导教师戴树贵一实验内容模拟电梯调度算法先来先服务算法最短查找时间算法实现对磁盘的驱动调度二实验目的1进一步理解磁盘调度算法的相关内容2了...

驱动调度实验报告

操作系统实验报告选题名称所在院系专业名称处理器调度计算机科学与技术学院计算机科学与技术学院日语双学位龚德兴徐莉莉张文卿王俏何慧楠刘艳茹朱静君姓名班级指导老师完成时间1202班付老师20xx122目录实验三驱动调...

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法实验报告目录一、课程设计目的............................................................................3二、课程…

实验报告六 磁盘调度算法

实验报告六磁盘调度算法班级软技2班学号20xx67003084姓名刘道林一实验内容熟悉磁盘的结构以及磁盘的驱动调度算法的模拟编程实现简单常用的磁盘驱动调度算法先来先服务FIFO电梯调度算法最短寻找时间优先算法扫...

操作系统磁盘调度算法课程设计报告及代码

淮阴工学院操作系统课程设计报告选题名称磁盘调度算法的模拟实现系院经济管理学院专业信息管理与信息系统班级姓名学号指导教师学年学期学年第学期年月日操作系统课程设计报告磁盘调度算法的模拟实现设计任务书指导教师签章年月...

磁盘调度实验报告(30篇)