1. 程式人生 > >c語言模擬磁碟尋道演算法:SSTF(最短尋道優先演算法、CSCAN(迴圈掃描演算法、SCAN(掃描演算法)

c語言模擬磁碟尋道演算法:SSTF(最短尋道優先演算法、CSCAN(迴圈掃描演算法、SCAN(掃描演算法)

#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;
}