C语言 磁盘调度模拟

什么是磁盘调度?
 磁盘调度指待的是访问的磁道时,当前磁头访问的方式(也指待是算法)。磁盘的访问也是一种I/O设备的访问,在数据访问中需要知道如何去访问从内存以及I/O传输过来的数据。怎么样去存储或者是读取在磁盘上面的数据。磁盘的调度的算法有很多种,例如:
FIFO:先进先出的调度策略,这个策略具有公平的优点,因为每个请求都会得到处理,并且是按照接收到的顺序进行处理。
SSTF:选择使磁头从当前位置开始移动最少的磁盘I/O请求,所以SSTF总是选择导致最小寻道时间的请求。
SCAN:SCAN要求磁头仅仅沿一个方向移动,并在途中满足所有未完成的请求,知道它到达这个方向上的最后一个磁道,或者在这个方向上没有其他请求为止。
C-SCAN:把扫描限定在一个方向,当访问到某个方向的最后一个磁道时,磁道返回磁盘相反方向磁道的末端,并再次开始扫描。
而本文模拟的是scan调度算法。
模拟内容

 编程序模拟磁盘移臂调度,假定磁盘有200个柱面,编号为0~199,当前存取臂的位置在143号柱面上,并刚刚完成了128号柱面的服务请求,如果请求的先后顺序为:86,145,93,179,95,150,103,176,132。试分别采用:(1) 先来先服务寻道算法FCFS。(2) 最短寻道时间优先算法SSTF。(3) 扫描算法SCAN。(4) 循环扫描算法CSCAN。输出存取臂的移动顺序,并分别计算出存取臂的移动总量。




 
算法实现:

#include <stdio.h>
#include <math.h>


void fcfs(int f[],int );
void sstf(int m[],int );
void scan(int d[],int);
void cscan(int e[],int);
void sort(int a[],int);
void main()
{
     printf("模拟磁盘移臂调度程序\n");
     printf("***********************************************\n");
     printf("***********************************************\n");
     printf("start:\n");
     int now=143;


     int a[]={86,145,93,179,95,150,103,176,132};
     fcfs(a,now);
     int aa[]={86,145,93,179,95,150,103,176,132};
     sstf(aa,now);
     int aaa[]={86,145,93,179,95,150,103,176,132};
     scan(aaa,now);
     int aaaa[]={86,145,93,179,95,150,103,176,132};     
     cscan(aaaa,now);
}




void fcfs(int f[],int fnow)
{
     int s=0,i;
     printf(" 先来先服务寻道顺序为:");
     for(i=0;i<9;i++)
          {
               s=s+fabs(f[i] - fnow);
               printf("%d ",f[i]);
          }
     printf("\n先来先服务和为:%d\n",s);
}


void sstf(int m[],int mnow)
{
     int n,k,tmp,x,sum=0;
     printf("最短时间服务顺序:");
     for(n=0;n<9;n++){
          tmp = fabs(m[0]-mnow);
          x = 0;
          for(k=1;k<9-n;k++){
               if(fabs(m[k]-mnow)<tmp){
                    x = k;
                    tmp = fabs(m[k]-mnow);
               }     
          }
          printf("%d ",m[x]);
               sum =sum +tmp;
               mnow = m[x];
               for(k=0;k<9-x-n;k++){
                    m[x+k]=m[x+k+1];
               }


     }
     printf("\n最短时间和为:%d\n",sum);
}


void scan(int d[],int dnow)
{     
     int x,y,sum=0;
     printf("扫描服务顺序:");
     sort(d,9);
     for(x = 0; x < 9; x++){
          if(d[x] > dnow){
               y = x;
               break;
          }               
     }
     for(x = y; x < 9; x++){
          printf("%d ",d[x]);
          sum = sum + fabs(dnow-d[x]);
     }
     for(x = y-1;x>=0;x--){
          printf("%d ",d[x]);
          sum = sum + fabs(dnow-d[x]);
     }
     printf("\n扫描和为:%d\n",sum);
}


void cscan(int e[],int enow){
     int x,y,sum =0;
     sort(e,9);
     printf("循环扫描顺序为:");
     for(x = 0; x < 9; x++){
          if(e[x] > enow){
               y = x;
               break;
          }     
     }
     for(x = y; x < 9; x++ ){
          printf("%d ",e[x]);
          sum = sum + fabs(enow-e[x]);     
     }
     for(x = 0;x < y; x++){
          printf("%d ",e[x]);
          sum = sum + fabs(enow-e[x]);
     }
     printf("\n循环扫描和为:%d\n",sum);


}
                                                                                                              
void sort(int a[],int n){
 int i,j,tmp;
 for(i=0;i<n-1;i++){
     for(j=0;j<n-i-1;j++){
        if(a[j]>a[j+1]){
            tmp=a[j+1];
            a[j+1]=a[j];
            a[j]=tmp;                //做数据交换位置处理
         } 
     } 
   }
} 




 





参考资料:http://blog.csdn.net/wanghao109/article/details/13004751


转载于:https://my.oschina.net/websec/blog/132913

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值