1. 程式人生 > >C語言作業系統——磁碟排程演算法(FCFS/SSTF/CSAN)

C語言作業系統——磁碟排程演算法(FCFS/SSTF/CSAN)

首先設定disk_scheduling.h標頭檔案

#include "stdio.h"
#include "math.h"
#include "windows.h"
#define MAX 50


void FCFS(int num[],int first,int count);//先來先服務磁碟排程演算法
void SSTF(int num[],int first,int count);//最短尋道時間優先磁碟排程演算法

void SCAN(int num[],int first,int count);//掃描演算法

再設定disk_scheduling.cpp檔案

#include "disk_scheduling.h"


void FCFS(int num[],int first,int count)//先來先服務磁碟排程演算法
{
int i;
int s[MAX];//移動距離
int sum=0;//所有移動距離的和
double avg=0;//平均值
printf("磁頭服務序列為:\n");
printf("磁軌號\t移動距離\n");
for(i=0;i<count;i++)
{
printf("%d\t",num[i]);
if(i==0)
{
s[0]=abs(num[0]-first);
printf("%d\n",s[0]);
}
else
{
s[i]=abs(num[i]-num[i-1]);
printf("%d\n",s[i]);
}
sum=sum+s[i];
}
avg=(double)sum/count;
printf("平均尋道長度為:%.3f\n",avg);
}


void SSTF(int num[],int first,int count)//最短尋道時間優先磁碟排程演算法
{
int i=0;
int s[MAX];//移動距離
int temp[MAX];//每道距離當前磁頭的距離
int data[MAX];//儲存原來num[]陣列中的資料
int sum=0;
double avg=0;
printf("磁頭服務序列為:\n");
printf("磁軌號\t移動距離\n");
for(int p=0;p<count;p++)
{
for(i=0;i<count;i++)
{
temp[i]=abs(num[i]-first);
}
for(i=0;i<count;i++)
{
int d=0;//用於判斷最小的距離
for(int j=0;j<count;j++)
{
if(temp[i]<=temp[j])
{
d++;
}
}
if(d==count)
{
printf("%d\t",num[i]);
s[p]=temp[i];
data[p]=num[i];
printf("%d\n",s[p]);
first=num[i];
num[i]=10000000;//設定最大,使其在下一次計算中排在最末
}
}
sum=sum+s[p];
}
for(i=0;i<count;i++)
{
num[i]=data[i];
}
avg=(double)sum/count;
printf("平均尋道長度為:%.3f\n",avg);
}


void SCAN(int num[],int first,int count)//掃描演算法
{
int i;
int s[MAX];//移動距離
int sum=0;//所有移動距離的和
int temp[MAX];//每道距離當前磁頭的距離
double avg=0;//平均值
int data[MAX];//儲存原來num[]陣列中的資料
int out=0;//用於記錄在磁軌之外的磁軌的數目
int in=0;//用於記錄在磁軌之內的磁軌的數目
int w[MAX];//儲存磁頭之外的磁軌
int n[MAX];//儲存磁頭之內的磁軌,n[]+w[]=num[]
printf("磁頭服務序列為:\n");
printf("磁軌號\t移動距離\n");
for(i=0;i<count;i++)
{
if(num[i]>=first)
{
w[out]=num[i];
out++;
}
else
{
n[in]=num[i];
in++;
}
}
for(int p=0;p<out;p++)//磁碟由內向外掃描
{
for(i=0;i<out;i++)
{
temp[i]=w[i]-first;
}
for(i=0;i<out;i++)
{
int d=0;//判斷最小距離
for(int j=0;j<out;j++)
{
if(temp[i]<=temp[j])
{
d++;
}
}
if(d==out)
{
printf("%d\t",w[i]);
s[p]=temp[i];
printf("%d\n",s[p]);
first=w[i];
w[i]=10000000;//設定最大,使其在下一次計算中排在最末
}
}
sum=sum+s[p];
}
for(p=out;p<count;p++)//磁碟由外向內掃描
{
for(i=0;i<in;i++)
{
temp[i]=abs(n[i]-first);
}
for(i=0;i<in;i++)
{
int d=0;//判斷最小距離
for(int j=0;j<in;j++)
{
if(temp[i]<=temp[j])
{
d++;
}
}
if(d==in)
{
printf("%d\t",n[i]);
s[p]=temp[i];
printf("%d\n",s[p]);
first=n[i];
n[i]=10000000;//設定最大,使其在下一次計算中排在最末
}
}
sum=sum+s[p];
}
avg=(double)sum/count;
printf("平均尋道長度為:%.3f\n",avg);

}

再設定disk_scheduling_test.cpp的主函式檔案

#include "disk_scheduling.h"


void main()
{
printf("____________磁碟排程演算法____________\n");
int count;
int num[MAX];//儲存請求序列
int first;//讀寫頭起始位置
printf("請輸入請求數:\n");
scanf("%d",&count);
printf("請輸入請求序列:\n");
for(int i=0;i<count;i++)
{
scanf("%d",&num[i]);
}
printf("請輸入讀寫頭起始位置:\n");
scanf("%d",&first);
printf("\n_________FCFS_________\n");
FCFS(num,first,count);
Sleep(1000);
printf("\n_________SSTF_________\n");
SSTF(num,first,count);
Sleep(1000);
printf("\n_________SCAN_________\n");
SCAN(num,first,count);
}