操作系统中磁盘调度算法(FCFS算法和SCAN算法)

# include  <stdio.h>
#  include   <stdlib.h>
# include <math.h>
#  define   N  200   //定义盘道数
#  define   T   0.2  //定义磁头移动一条盘道所用的时间
#define   start  100 //定义初始磁针位置
typedef struct{
    int  rank;
    int  num;
    bool   flag;
} struct_arry;
int FCFS( int  a[])
{int  sum;
float  time ;
 sum=abs(start-a[0]);
  for(int i=0;i<9;i++)
      sum=sum+abs(a[i]-a[i+1]);
time= sum*T;
printf("先来先服务算法:\n");
for(int i=0;i<10;i++)
{ printf("序列%d",i+1);
printf("           ");
printf("所访问磁道编号:%d",a[i]);
printf("\n");
printf("\n");
}
printf("磁头移动距离:%d",sum);
printf("         ");
printf("寻道时间:%5.1fs",time);
return  time;
}
int  SCAN(int  a[])
{ struct_arry  max[10];
   struct_arry  min[10];
   struct_arry   t;
   int  i,j,k;
   int   sum,s,e;
   float  time;    
for( i=0;i<10;i++)    
    { max[i].flag=false;
      min[i].flag=false;
    }    
for( i=0,j=0,k=0;i<10;i++)    
    { 
    if(a[i]>=start)
       { max[j].num=a[i];
       max[j].rank=i;
       max[j].flag=true;
       j++;
       }
       else
       { min[k].num=a[i];
         min[k].rank=i;
         min[k].flag=true;
         k++;
       }
}
s=j-1;
e=k-1;
for(i=0;i<9;i++)
{    if(max[i].flag)
   {
     for(j=0;j<9-i;j++)
    { 
     if(max[j].flag&&max[j+1].flag&&(max[j].num>=max[j+1].num))
        {
        t=max[j+1];
        max[j+1]=max[j];
        max[j]=t; }
      }    
    }  
    else
    break;
}
for(i=0;i<9;i++)
{    if(min[i].flag)
   {
     for(j=0;j<9-i;j++)
    { 
     if(min[j].flag&&(min[j].num<min[j+1].num))
      {  t=min[j+1];
        min[j+1]=min[j];
        min[j]=t;      
      } }    
   }  
    else
    break;
}
if((s>0))
{
if(e==-1)
sum=abs(start-max[0].num);
else
sum=abs(start-max[0].num)+max[s].num-min[0].num;
}
else
sum=start-min[0].num;

 for(i=0;i<10;i++)
   { if((max[i].flag==true&&max[i+1].flag==false)||max[i].flag==false)
      break;
    else
    sum=sum+abs(max[i].num-max[i+1].num);
    }      
   for(i=0;i<10;i++)
   { if((min[i].flag==true&&min[i+1].flag==false)||min[i].flag==false)
      break;
    else
    sum=sum+abs(min[i].num-min[i+1].num);
    }
printf("循环算法:\n");
      for(i=0;i<10;i++)
      {if(max[i].flag)
        {   printf("\n");
        printf("序列%d",max[i].rank+1);
          printf("         ");
         printf("所访问磁道编号:%d",max[i].num);
          printf("\n");
        }
      }
          for(i=0;i<10;i++)
      {if(min[i].flag)
        {  printf("\n");
        printf("序列%d",min[i].rank+1);
          printf("         ");
         printf("所访问磁道编号:%d",min[i].num);
          printf("\n");
        }
      }    
time=sum*T;
printf("磁头移动距离:%d",sum);
printf("         ");
printf("寻道时间:%5.1fs",time);
return  time;
}
int main()
{   int  i;
    int  a[10];
    float  time1,time2;
    for(i=0;i<10;i++)
    {
    printf("请输入第%d序列访问的磁道号:",i+1);
    scanf("%d",&a[i]);
    printf("\n");}
    printf("\n");
   time1= FCFS(a);
    printf("\n");
     printf("\n");
    time2=SCAN(a);
    printf("\n");
    if(time1<time2)
    printf("对此访问序列,先来先服务算法更好");
    else
    {  if(time1>time2)
    printf("对此访问序列,循环算法更好");
    else
    printf("对此访问序列,两个算法寻道时间相同");        
    }
    return  0;
}

猜你喜欢

转载自www.cnblogs.com/hbu-xiaopipi/p/10877904.html
今日推荐