最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

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

来源:动视网 责编:小OO 时间:2025-10-06 09:47:26
文档

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

实验四磁盘调度一、实验目的:本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。二、实验内容:对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间三、实验准备:1.相关理论知识:(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次
推荐度:
导读实验四磁盘调度一、实验目的:本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。二、实验内容:对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间三、实验准备:1.相关理论知识:(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次
实验四  磁盘调度

一、实验目的:

本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。

二、实验内容:

对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间

三、实验准备:

1.相关理论知识:

(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。

(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。

(2)磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用磁盘调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

2.测试数据:

磁盘读写请求队列:20,44,40,4,80,12,76

当前磁头位置:50 

试问采用FCFS、SSTF、SCAN磁盘调度算法时寻道顺序及平均寻道时间分别为多少? 

四、实验过程:

1.流程图

      SCAN算法(扫描算法)流程图:

2. 源代码

#include

#include

#include

#include

#define maxsize 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    {

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

    }

    return sum;

}

/*********************冒泡排序算法**************************/

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

    int i,j;

    int temp;

for(i=0;i for(j=i+1;j    {

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

        { 

           temp=cidao[i];

           cidao[i]=cidao[j];

           cidao[j]=temp;

        }

    }

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

for( i=0;i    {

cout<    }

cout<    return cidao;

/*********************先来先服务调度算法************************/

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

{

    int now;//当前磁道号

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

    int j,i;

    int a;

    char str[100];

    float ave;   //平均寻道长度

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

for( i=0;i    {

cout<    }

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

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

    a=decide(str);

    if(a==0)

    {

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

    }

    else 

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

    sum+=abs(cidao[0]-now);

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

for( i=0;i    {

cout<    }

for(i=0,j=1;j    {

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

        ave=(float)(sum)/(float)(m);

    }

cout< cout<<"平均寻道长度:"<}

/**********************最短寻道时间优先调度算法********************/

void SSTF(int cidao[],int m)

{

   int k=1;

   int now,l,r;

   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<<"输入数据的类型错误,请重新输入!"<     goto C;

   }

   else 

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

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

   {

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

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

cout<      sum=now-cidao[0];

   }

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

   {

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

for(i=0;i cout<      sum=cidao[m-1]-now;

   }

if(now>cidao[0]&&now   {

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

while(cidao[k]       {

          k++;

       }

       l=k-1;

       r=k;

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

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

          {

cout<             sum+=now-cidao[l];

             now=cidao[l];

             l=l-1;

          }

          else

          {

cout<             sum+=cidao[r]-now;

             now=cidao[r];

             r=r+1;

          }

       }

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

       {

for(j=r;j          {

cout<          }

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

       }

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

       {

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

          {

cout<          }

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

       }

   }

   ave=(float)(sum)/(float)(m);

cout< cout<<"平均寻道长度: "<}

/*************************扫描调度算法*************************/

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

{

   int k=1;

   int now,l,r,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<<"输入数据的类型错误,请重新输入!"<     goto D;

   }

   else 

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

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

   {   

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

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

cout<      sum=now-cidao[0];

   }

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

   {   

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

for(i=0;i cout<      sum=cidao[m-1]-now;

   }

if(now>cidao[0]&&now   {

while(cidao[k]       {

           k++;

       }

       l=k-1;

       r=k;

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

cin>>d;

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

       {

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

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

           {

cout<           }

for(j=r;j           {

cout<           }

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

       }

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

       {

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

for(j=r;j           {

cout<           }

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

           {

cout<           }

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

       }

   }     

   ave=(float)(sum)/(float)(m);

cout< cout<<"平均寻道长度: "<}

/************************循环扫描调度算法*****************************/

void CSCAN(int cidao[],int m)

{

   int k=1;

   int now,l,r;

   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<<"输入数据的类型错误,请重新输入!"<     goto E;

   }

   else 

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

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

   {

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

for(i=0;i cout<      sum=now-2*cidao[0]+cidao[m-1];

   }

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

   {

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

for(i=0;i cout<      sum=cidao[m-1]-now;

   }

if(now>cidao[0]&&now   {

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

while(cidao[k]      {

          k++;

      }

      l=k-1;

      r=k;

for(j=r;j      {

cout<      }

for(j=0;j      {

cout<      }

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

   }

   ave=(float)(sum)/(float)(m);

cout< cout<<"平均寻道长度: "<}

void main()

{

   int a;        

   int c;     //菜单项

   int cidao[maxsize];

   int i=0,count;

   char str[100];

cout<<"请输入磁道序列(0结束):"< A:cin>>str; //对输入数据进行有效性判断

   a=decide(str);

   if(a==0)

   {

cout<<"输入数据的类型错误,请重新输入!"<       goto A;//输入错误,跳转到A,重新输入

   }    

   else

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

   i++;

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

   {

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

      a=decide(str);

      if(a==0)

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

      { 

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

        i++;

      }

   }

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

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

for(i=0;i   {

cout<   }

cout<   while(1)

   {

cout< cout<<"**********************************************"< cout<<" 系统菜单 "<cout<<"*** ***"<cout<<"** 1. 先来先服务 **"<cout<<"** **"<cout<<"** 2. 最短寻道时间优先 **"<cout<<"** **"<cout<<"** 3. 扫描调度 **"<cout<<"** **"<cout<<"** 4. 循环扫描 **"<cout<<"** **"<cout<<"** 5. 退出 **"<cout<<"*** ***"< G:cout<<"请选择算法:";

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

      a=decide(str);

      if(a==0)

      {

   cout<<"输入数据的类型错误,请重新输入!"<       goto F;//输入错误,跳转到F,重新输入

      }    

      else

         c=trans(str,a);

      if(c==5)

        break;

if(c>5)

      {

     cout<<"数据输入错误!请重新输入"<          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;

      }}}

3. 运行界面: 

五、实验心得:

通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中发现了自己的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。

文档

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

实验四磁盘调度一、实验目的:本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。二、实验内容:对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间三、实验准备:1.相关理论知识:(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top