操作系统磁道调度算法

来源:互联网 发布:微信js sdk接口文档 编辑:程序博客网 时间:2024/05/22 05:29
#include<stdio.h>#include<stdlib.h>#include<time.h>#include<math.h>#define MAX1 10int cd_max,Limit;int search[MAX1];//寻道的地址int ch[MAX1];//移动大小int x_search[MAX1];//修改后寻道地址 int ini,all;//ini为初始地址,all为总移动地址 int flag[MAX1];//是否访问 int QS;//scan算法趋势:1向后,0向前 float aver;int Best[4][2];//比较 void FCFS();void SSTF();void SCAN();void CSCAN();void com();void inic(){printf("设置磁道最大值:");scanf("%d",&cd_max);printf("磁道寻址范围:0~%d",cd_max);putchar(10);printf("磁道寻找最大值:");scanf("%d",&Limit);printf("磁道寻找初始地址:");scanf("%d",&ini);putchar(10);}void window(){int n;do{putchar(10);printf("\t\t\t********************************************\n");printf("\t\t\t*************操作系统课程设计***************\n");printf("\t\t\t***************磁盘调度算法*****************\n");printf("\t\t\t********************************************\n");printf("\t\t\t***********1、先来先服务FCFS       *********\n");printf("\t\t\t***********2、最短寻道时间优先SSTF *********\n");printf("\t\t\t***********3、扫描算法SCAN         *********\n");printf("\t\t\t***********4、循环扫描算法C-SCAN   *********\n");printf("\t\t\t***********5、各类算法比较         *********\n");printf("\t\t\t***********0、离开程序             *********\n");printf("\t\t\t********************************************\n");printf("\t\t\t                          请输入你的选择:");scanf("%d",&n);switch(n){case 1:FCFS();break;case 2:SSTF();break;case 3:SCAN();break;case 4:CSCAN();break;case 5:com();break;}}while(n!=0);printf("谢谢使用!\n");}void print(int pri[],int x){int i;for(i=0;i<x;i++){printf("%5d",pri[i]);}}void setDI(int search[]){int i;srand(time(NULL));for(i=0;i<MAX1;i++){search[i]=rand()%Limit;}putchar(10);}void FCFS(){int i;all=0;printf("fcfs算法开始:\n\t"); printf("初始磁道号:%d\n",ini);printf("需要寻找的磁道号:\n");print(search,MAX1);putchar(10);for( i=0;i<MAX1;i++){x_search[i]=search[i];}for(i=0;i<MAX1;i++){if(i==0)ch[i]=abs(x_search[i]-ini);elsech[i]=abs(x_search[i]-x_search[i-1]);}for(i=0;i<MAX1;i++){all+=ch[i];}printf("查找顺序:\n");print(x_search,MAX1);putchar(10);printf("移动距离:\n");print(ch,MAX1);putchar(10);aver=(float)all/MAX1;printf("移动总距离:%5d,平均移动距离:%0.2f",all,aver);putchar(10);Best[0][0]=all;Best[0][1]=1;} void SSTF(){int i,min=0,tmp,j;int temp[MAX1];//判断最短地址的缓存数组 all=0;for(i=0;i<MAX1;i++){flag[i]=0;}printf("SSTF算法开始:\n\t"); printf("初始磁道号:%d\n",ini);printf("需要寻找的磁道号:\n");print(search,MAX1);putchar(10);/*for(i=0;i<MAX1;i++){temp[i]=search[i];}*/for(i=0;i<MAX1;i++){if(i==0){for(j=0;j<MAX1;j++){temp[j]=abs(search[j]-ini);//j ? i?}min=0;for(j=0;j<MAX1;j++){if(temp[min]>temp[j])min=j;}flag[min]=-1;x_search[0]=search[min];}else//非0情况 {for(j=0;j<MAX1;j++){if(flag[j]!=-1){temp[j]=abs(x_search[i-1]-search[j]);}elsetemp[j]=-1;}min=0;for(j=0;j<MAX1;j++){if(temp[j]!=-1 && temp[min]>temp[j])min=j;}flag[min]=-1;x_search[i]=search[min];}}for(i=0;i<MAX1;i++){if(i==0)ch[i]=abs(x_search[i]-ini);elsech[i]=abs(x_search[i]-x_search[i-1]);}for(i=0;i<MAX1;i++){all+=ch[i];}printf("查找顺序:\n");print(x_search,MAX1);putchar(10);printf("移动距离:\n");print(ch,MAX1);putchar(10);aver=(float)all/MAX1;printf("移动总距离:%5d,平均移动距离:%0.2f",all,aver);putchar(10);Best[1][0]=all;Best[1][1]=2;}void SCAN(){int sort[MAX1],temp,k,i,j; all=0;printf("请输入查找的趋势(1向后查找,0向前查找):");scanf("%d",&QS);printf("SCAN算法开始:\n\t"); printf("初始磁道号:%d,搜索趋势:",ini);if(QS==1)printf("向后搜索!\n");elseprintf("向前搜索!\n");printf("需要寻找的磁道号:\n");print(search,MAX1);putchar(10);//核心算法 *///////////////////for(i=0;i<MAX1;i++){sort[i]=search[i];}for(i=0;i<MAX1-1;i++)for(j=0;j<MAX1-1-i;j++){if(sort[j]>sort[j+1]){temp=sort[j];sort[j]=sort[j+1];sort[j+1]=temp;}}for(temp=0,k=0;k<MAX1;k++){if(ini<=sort[k]){temp=k;break;}if(ini>sort[MAX1-1])temp=MAX1-1;}if(QS==1)//向后搜索 {for(j=0,i=temp+1;j<MAX1;j++,i++){if(i==MAX1)break;x_search[j]=sort[i];}for(i=temp;j<MAX1;j++,i--){x_search[j]=sort[i];if(i<0)break;}}else{for(j=0,i=temp;j<MAX1;j++,i--){x_search[j]=sort[i];if(i<0)break;}for(i=temp+1;j<MAX1;j++,i++){x_search[j]=sort[i];if(i==MAX1)break;}}/*****************************/for(i=0;i<MAX1;i++){if(i==0)ch[i]=abs(x_search[i]-ini);elsech[i]=abs(x_search[i]-x_search[i-1]);}for(i=0;i<MAX1;i++){all+=ch[i];}printf("查找顺序:\n");print(x_search,MAX1);putchar(10);printf("移动距离:\n");print(ch,MAX1);putchar(10);aver=(float)all/MAX1;printf("移动总距离:%5d,平均移动距离:%0.2f",all,aver);putchar(10);Best[2][0]=all;Best[2][1]=3;}void CSCAN(){int temp,x_search1[MAX1+2],ch1[MAX1+2],sort[MAX1],i,j,k;all=0;printf("请输入查找的趋势(1向后查找,0向前查找):");scanf("%d",&QS);printf("SCAN算法开始:\n\t"); printf("初始磁道号:%d,搜索趋势:",ini);if(QS==1)printf("向后搜索!\n");elseprintf("向前搜索!\n");printf("需要寻找的磁道号:\n");print(search,MAX1);putchar(10);/**************************************/for(i=0;i<MAX1;i++){sort[i]=search[i];}for(i=0;i<MAX1-1;i++)for(j=0;j<MAX1-1-i;j++){if(sort[j]>sort[j+1]){temp=sort[j];sort[j]=sort[j+1];sort[j+1]=temp;}}for(temp=0,k=0;k<MAX1;k++){if(ini<=sort[k]){temp=k;break;}if(ini>sort[MAX1-1])temp=MAX1-1;}//printf("%d   %ds\n",temp,k);if(QS==1)//向后搜索 {for(j=0,i=temp+1;j<MAX1+2;j++,i++){if(i==MAX1)break;x_search1[j]=sort[i];}x_search1[j]=cd_max;j++;x_search1[j]=0;//将头尾放入 j++;for(i=0;j<MAX1+2;j++,i++){x_search1[j]=sort[i];if(i>temp)break;}}else{for(j=0,i=temp-1;j<MAX1+2;j++,i--){x_search1[j]=sort[i];if(i<0)break;}if(temp!=MAX1-1){x_search1[j]=0;j++;x_search1[j]=cd_max;//将头尾放入 j++;for(i=MAX1-1;j<MAX1+2;j++,i--){x_search1[j]=sort[i];if(i==temp)break;}}}/**************************************/if(temp==MAX1-1) //初始值最大,向前搜索不用考虑0 到cd_max k=MAX1;elsek=MAX1+2;for(i=0;i<k;i++){if(i==0)ch1[i]=abs(x_search1[i]-ini);elsech1[i]=abs(x_search1[i]-x_search1[i-1]);}for(i=0;i<k;i++){all+=ch1[i];}printf("查找顺序:\n");print(x_search1,k);putchar(10);printf("移动距离:\n");print(ch1,k);putchar(10);aver=(float)all/MAX1;printf("移动总距离:%5d,平均移动距离:%0.2f",all,aver);putchar(10);Best[3][0]=all;Best[3][1]=4;}void com(){int min,temp,temp1,i,j;min=0;FCFS();SSTF();SCAN();CSCAN();    for(i=0;i<3;i++)    {         for(j=i+1;j<4;j++)         {              if(Best[i][0]<Best[j][0])             {                 temp=Best[i][0];                 temp1=Best[i][1];                 Best[i][0]=Best[j][0];                 Best[i][1]=Best[j][1];                 Best[j][0]=temp;                 Best[j][1]=temp1;             }         }    }printf("由此可知(排序):\n");for(i=0;i<4;i++){if(Best[i][1]==1)printf("  FCFS算法:");if(Best[i][1]==2)printf("  SSTF算法:");if(Best[i][1]==3)printf("  SCAN算法:");if(Best[i][1]==4) printf("C-SCAN算法:");printf(" %7d",Best[i][0]);putchar(10);}}int cd_main(){inic();setDI(search);window();return 0;}
海译翻译公司
原创粉丝点击