一、实验目的
1、对磁盘调度的相关知识作进一步的了解,明确磁盘调度的原理。
2、加深理解磁盘调度的主要任务。
3、通过编程,掌握磁盘调度的主要算法。
二、实验内容
1、对于如下给定的一组磁盘访问进行调度:
请求服务到达 A B C D E F G H I J K
访问的磁道号 30 50 100 180 20 90 150 70 80 10 160
2、要求分别采用先来先服务、最短寻道优先以及电梯调度方法进行调度。
3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。
4、假定当前读写头在90号,向磁道号增加的方向移动。
程序代码:
#include<stdio.h>
#include<math.h>
#define N 11
void main()
{
//请求服务到达 A B C D E F G H I J K
//访问的磁道号 30 50 100 180 20 90 150 70 80 10 160
//要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。
//假定当前读写头在90号,向磁道号增加的方向移动。
//初始化
int track[N],track2[N+1];
int i ;
printf("请输入访问磁道序列:\n");
for (i=0;i<N;i++)
{
scanf("%d",&track[i]);
track2[i] = track[i] ;
}
//先来先服务
printf("先来先服务:");
for (i=0;i<N;i++)
{
printf("%d ",track[i]);
}
double s = abs(90-track[0]) ;
for (i=0;i<=N-2;i++)
{
s += abs(track[i]-track[i+1]) ;
}
printf("\n平均移动磁道数:%0.1lf\n\n",s/N);
//最短寻道优先
s = 0 ;
printf("最短寻道优先:");
int temp[N];
track2[N] = 90 ;
int k = N ; //当前磁道
int flag ; //标志
int min; //最小差值
int t ; //最小差值的数组下标
int j;
for (j=0 ; j<N ;j++ )
{
flag = 0;
for (i=0;i<N;i++)
{
if((i!=k)&&flag==0&& track2[i]!=-1)
{
min = abs(track2[i]- track2[k]);
t = i;
flag++;
}
if((i!=k)&&(track2[i]!=-1)&&(abs(track2[i]-track2[k]) < min ) )
{
min =abs(track2[i]-track2[k]);
t = i;
}
}
s += min ;
temp[j] = t ;
track2[k] = -1 ;
k = t ;
}
for(i=0;i<N;i++)
printf("%d ",track[temp[i]]);
printf("\n平均移动磁道数:%0.1lf\n\n",s/N);
//电梯调度方法
s = 0 ;
printf("电梯调度:");
for (i=0;i<N-1;i++)
{
for (j=0;j<N-i-1;j++)
{
if (track[j]>track[j+1])
{
t=track[j];track[j]= track[j+1];track[j+1]=t;
}
}
}
for (i=0;i<N;i++)
{
if (track[i]>90)
break;
}
for (j=i;j<N;j++)
printf("%d ",track[j]);
for(j=i-1;j>=0;j--)
printf("%d ",track[j]);
s = (track[N-1]-90)+(track[N-1]-track[0]);
printf("\n平均移动磁道数:%0.1lf",s/N);
printf("\n");
}
运行结果:
请输入访问磁道序列:
30 50 100 180 2090 150 70 80 10 160
先来先服务:30 50 100 180 20 90 150 70 80 10 160
平均移动磁道数:73.6
最短寻道优先:90 100 80 70 50 30 20 10 150 160 180
平均移动磁道数:24.5
电梯调度:100 150 160 180 90 80 70 50 30 20 10
平均移动磁道数:23.6
Press any key tocontinue