c語言模擬磁碟尋道演算法:SSTF(最短尋道優先演算法、CSCAN(迴圈掃描演算法、SCAN(掃描演算法)
阿新 • • 發佈:2018-12-23
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<math.h> #define MAX 100 //磁道範圍 #define N 20 //序列數目 int list[MAX]; //存放隨機產生的序列 int visit[MAX]; //標記陣列 int location;//初始磁頭位置 int closedistant; //儲存其他磁軌與當前磁頭所在磁軌的最短距離 //按磁軌從小到大排序 void sort() { int i; int j; int t; for(i=0;i<N-1;i++){ for(j=i+1;j<N;j++){ if(list[j]<list[i]){ t=list[i]; list[i]=list[j]; list[j]=t; } } } } //隨機產生磁頭初始位置和訪問序列 void CreateList() { int j; int i; location=rand()%MAX+1;//隨機產生初始磁頭位置 printf("當前磁頭位置:%d\n\n",location); printf("請求訪問的磁軌號序列:\n"); for(i=0;i<N;i++){ //隨機產生請求磁軌號序列 list[i]=rand()%MAX+1; printf("%d ",list[i]); } printf("\n\n"); } //最短尋道優先演算法 void SSTF() { int i; int j; int k;//記錄最近的磁軌號 int loca; int move; int shortest; //記錄最短的距離 int after[MAX]; memset(visit,1,sizeof(visit)); move=0; loca=location; for(i=0;i<N;i++){ shortest=MAX; for(j=0;j<N;j++){//有更近磁軌更新 if(visit[j]){ if(fabs(loca-list[j])<shortest){ shortest=fabs(loca-list[j]); k=j; } } } move=move+shortest; //記錄移動的距離 loca=list[k]; //跟蹤當前磁頭所在位置 visit[k]=0; //標記已訪問 after[i]=list[k]; //記錄路徑 } printf("\n採用SSTF演算法後的尋道序列為:\n"); for(i=0;i<N-1;i++){ printf("%d->",after[i]); } printf("%d\n\n",after[i]); printf("所有程序執行後磁頭執行的總磁軌數為:%d\n\n",move); printf("平均尋道時間為:%.2lf\n\n",move*1.0/N); printf("\n-------------------------------------------------------\n\n"); } //迴圈掃描演算法 void CSCAN() { int i; int j; int move; int loca; int after[MAX]; i=0; loca=location; for(i=0;i<N;i++){ //找到磁頭在序列中的位置 if(list[i]>=loca){ break; } } move=0; for(j=0;j<N;i++,j++){ if(i==N){ //形成頭尾相連 i=0; } move=move+fabs(list[i]-loca); //記錄移動的距離 loca=list[i]; //記錄當前磁頭所在位置 after[j]=list[i]; //記錄路徑 } printf("\n本演算法規定磁頭自裡向外移動\n\n"); printf("採用CSCAN演算法後的尋道序列為:\n"); for(i=0;i<N-1;i++){ printf("%d->",after[i]); } printf("%d\n\n",after[i]); printf("所有程序執行後磁頭執行的總磁軌數為:%d\n\n",move); printf("平均尋道時間為:%.2lf\n\n",move*1.0/N); printf("\n-------------------------------------------------------\n\n"); } //掃描演算法 void SCAN() { int i; int j; int k; int move; int loca; int after[MAX]; loca=location; i=0; for(i=0;i<N;i++){ //找到當前磁頭所在位置 if(list[i]>=loca){ break; } } j=i-1; k=0; move=0; while(i<N){//先自裡向外 move=move+fabs(list[i]-loca);//記錄移動的距離 loca=list[i]; //記錄當前磁頭位置 after[k++]=list[i];//記錄路徑 i++; } while(j>=0){//後自外向裡 ` move=move+fabs(list[j]-loca);//記錄移動的距離 loca=list[j]; //記錄當前磁頭位置 after[k++]=list[j];//記錄路徑 j--; } printf("\n本演算法規定磁頭初始方向為自低磁軌向高磁軌\n\n"); printf("採用SCAN演算法後的尋道序列為:\n"); for(i=0;i<N-1;i++){ printf("%d->",after[i]); } printf("%d\n\n",after[i]); printf("所有程序執行後磁頭執行的總磁軌數為:%d\n\n",move); printf("平均尋道時間為:%.2lf\n\n",move*1.0/N); printf("\n-------------------------------------------------------\n\n"); } void Start() { sort(); printf("請選擇:\n1、SSTF(最短尋道優先演算法)\n2、CSCAN(迴圈掃描演算法)\n"); printf("3、SCAN(掃描演算法)\n4、重新產生一組新的序列\n5、結束\n\n"); char c; while(c=getchar(),c!='5'){ switch(c){ case '1':SSTF();break; case '2':CSCAN();break; case '3':SCAN();break; case '4':CreateList();sort();break; default:break; } } } int main() { srand((unsigned)time(NULL)); CreateList(); Start(); return 0; }