# 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; }
操作系统中磁盘调度算法(FCFS算法和SCAN算法)
猜你喜欢
转载自www.cnblogs.com/hbu-xiaopipi/p/10877904.html
今日推荐
周排行