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

猜你喜欢

转载自blog.csdn.net/wu_zx520/article/details/80558026