操作系统课程设计磁盘调度算法.docx

上传人:b****3 文档编号:2843826 上传时间:2022-11-15 格式:DOCX 页数:11 大小:19KB
下载 相关 举报
操作系统课程设计磁盘调度算法.docx_第1页
第1页 / 共11页
操作系统课程设计磁盘调度算法.docx_第2页
第2页 / 共11页
操作系统课程设计磁盘调度算法.docx_第3页
第3页 / 共11页
操作系统课程设计磁盘调度算法.docx_第4页
第4页 / 共11页
操作系统课程设计磁盘调度算法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

操作系统课程设计磁盘调度算法.docx

《操作系统课程设计磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计磁盘调度算法.docx(11页珍藏版)》请在冰豆网上搜索。

操作系统课程设计磁盘调度算法.docx

操作系统课程设计磁盘调度算法

1.    实验题目:

磁盘调度算法。

建立相应的数据结构;

在屏幕上显示磁盘请求的服务状况;

将一批磁盘请求的情况存磁盘文件,以后可以读出并重放;

计算磁头移动的总距离及平均移动距离;

支持算法:

FIFO、SSTF、SCAN、CSCAN;

2.设计目的:

调度磁盘I/O请求服务,采用好的方式能提高访问时间和带宽。

本实验通过编程对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windos平台上实现,更好的掌握操作系统的原理以及实现方法,提高综合运用专业课知识的能力。

3.任务及要求

3.1设计任务

编程实现下述磁盘调度算法,并求出每种算法的平均寻道长度:

1、 先来先服务算法(FCFS)

2、 最短寻道时间算法(SSTF)

3、 扫描算法(SCAN)

4、 循环扫描算法(CSCAN)

3.2设计要求

对用户指定的磁盘调度请求序列,基于以上四种算法,实现各自的调度顺序并输出,同时计算出各种算法下的平均寻道长度。

4.算法及数据结构

4.1算法的总体思想

queue[n]为请求调度序列,diskrode为磁盘磁道数,headstarts为正在调度的磁道

①先来先服务算法(FCFS)

按queue[n]数组的顺序进行磁盘调度,将前一个调度磁道与下一个调度磁道的差值累加起来,得到总的寻道长度,再除以n得到平均寻道长度。

②最短寻道时间优先算法(SSTF)

将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,通过循环语句找出离起始磁头最短的位置。

③扫描算法(SCAN)

将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,再在定位处反向遍历到另一端。

当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁

道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

④循环扫描算法(CSCAN)

将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,反向到另一端点再以此方向进行遍历,直到queue[n]中所有都调度完。

当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上磁盘磁道总长度,再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

 

5、源代码:

#include

#include

#include

voidmenu()

{

  cout<<"*********************菜单*********************"<

  cout<<"******1、先来先服务算法(FCFS)     **********"<

  cout<<"******2、最短寻道时间优先算法(SSTF)**********"<

  cout<<"******3、扫描算法(SCAN)           **********"<

  cout<<"******4、循环扫描算法(CSCAN)      **********"<

  cout<<"******5、退出                      **********"<

  cout<<"**********************************************"<

}

/*======================初始化序列=======================*/

voidinit(intqueue[],intqueue_copy[],intn)

{

  inti;

  for(i=0;i

  queue[i]=queue_copy[i];

}

//对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个

intfix(intqueue[],intn,intheadstarts)

{

 inti=0;

 while(iqueue[i])

 {

  i++;

 }

 if(i>n-1)

  returnn-1;       //当前磁道号大于磁盘请求序列中的所有磁道

 if(i==0)

  return-1;        //当前磁道号小于磁盘请求序列中的所有磁道

 else

  returni-1;       //返回小于当前磁道号中最大的一个

}

/*=================使用冒泡算法从小到大排序==============*/

int*bubble(intqueue[],intm)

{

 inti,j;

 inttemp;

 for(i=0;i

  for(j=i+1;j

  {

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

   {

    temp=queue[i];

    queue[i]=queue[j];

    queue[j]=temp;

   }

  }

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

";

  for(i=0;i

  {

   cout<

  }

  cout<

  returnqueue;

}

/*====================以下是FCFS算法==================*/

voidFCFS(intqueue[],intn,intdiskrode,intheadstarts) //queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道

{

  cout<<"************以下为FCFS调度算法***********"<

  inti;

  intcount=0;

  if(headstarts>queue[0])

   count+=headstarts-queue[0];

  else

   count+=queue[0]-headstarts;

      cout<<"调度序列为:

";

      cout<

   for(i=0;i

   {

     cout<

          if(queue[i]>queue[i+1])

              count+=queue[i]-queue[i+1];

    else

     count+=queue[i+1]-queue[i];

   }

   cout<

   cout<

   cout<<"总的寻道长度为:

"<

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

"<

}

/*=====================SSTF算法====================*/

voidSSTF(intqueue[],intn,intdiskrode,intheadstarts) 

{

 intk=1;

 intl,r;

 inti,j,count=0;

 queue=bubble(queue,n);

   cout<<"************以下为SSTF调度算法***********"<

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

  {

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

";

   cout<

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

    cout<

   count=headstarts-queue[0];

  }

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

  {

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

";

   cout<

   for(i=0;i

    cout<

   count=queue[n-1]-headstarts;

  }

  if(headstarts>queue[0]&&headstarts

  {

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

";

   cout<

   while(queue[k]

   {

    k++; 

   }

    l=k-1;

    r=k;

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

    {

      if( (headstarts-queue[l])<(queue

-headstarts))

      {

       cout<

       count+=headstarts-queue[l];

       headstarts=queue[l];

        l=l-1;

      }

      else

       if((headstarts-queue[l])==(queue-headstarts))

      {

       cout<

       count+=headstarts-queue[l];

       headstarts=queue[l];

       l=l-1;

      }

      else

      {

         cout<

         count+=queue-headstarts;

       headstarts=queue;

      r=r+1;

      }

    }

    if(l==-1) //磁头移动到序列的最小号,返

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1