一、设计目的:
加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法中的最短寻道优先算法。
通过编程实现磁盘调度中最短寻道优先算法。
设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。
最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
三、程序结构:首先,用srand()和rand()函数分别进行初始化、随机数定义和产生互不相同的磁道号序列;
接着,找到最先访问的那个磁道进行访问;
然后,把剩下的所有待访问的磁道一一访问;
最后,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。
源程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 51
struct TCB //track control block磁道控制块
{
int tn; //track number磁道号
int flag; //完成标志 flag=-1没完成 flag=1完成
}track[N];
int a[N]; //记录磁道访问的先后顺序
int randomnumber(int n,int max,int min) //各磁道互不相同
{
srand((int)time(NULL));
int t; //用来判断这个随机数是否重复
int x,y;
for(x=1;x<=n;)
{
t=rand()%(max-min+1)+min;
for(y=1;y<x;y++)
{if(track[y].tn==t) break;}
if(y==x) //不重复
{track[x++].tn=t;track[--x].flag=-1;x++;}//有进程的为-1,没有的为0 (系统初始化)
}
}
int SSTF(int n,int present,int max,int min)
{
/*这个最短寻道时间优先要分两部分考虑,
第一,访问第一个磁道:
比如说磁头开始处在第六道,然后等待服务的磁道先后顺序为8,2,5,3,7,9
那么问题来了,这个最短访问磁道距离为1(分别是磁道5和7),
那么我就以这两个磁道先到达的处理,那就是处理5;
当然,除了第一个访问的会出现这种问题,之后不会出现了(因为顺序)
第二,访问之后的磁道就以当前磁头所在地找最短的访问
*/
int z=1; //记录顺序访问数组a的下标
int s=0; // 记录对于第一个访问中最短距离有几个
int sum=0; //移动的磁道总数
int add=0; //记录已经访问的磁道个数
int md=max-min; //min distance用来存当前最短距离 (初值最大)
int mdp; //min distance position用来存放当前最短距离磁道下标
int i,j;
//访问第一个磁道
for(i=1;i<=n;i++) //找最小距离
{
if(abs(present-track[i].tn)<md)
md=abs(present-track[i].tn);
}
for(i=1;i<=n;i++) //找最小距离的个数 ,mdp记录的是最后一个磁道其md等于最小距离的下标
{
if(md==abs(present-track[i].tn)) {s++;mdp=i;}
}
if(s==1) //如果只有一个,那就直接访问
{
a[z++]=track[mdp].tn;
track[mdp].flag=1;
sum+=abs(present-track[mdp].tn);
present=track[mdp].tn;
add+=1;
}
else if(s>1) //如果有两个
{
for(i=1;i<=n;i++) //先找到最先到达的一个 ,再访问
if(md==abs(present-track[i].tn)) {mdp=i;break;}
a[z++]=track[mdp].tn;
track[mdp].flag=1;
sum+=abs(present-track[mdp].tn);
present=track[mdp].tn;
add+=1;
}
//访问其他的磁道
while(add<n)
{
md=max-min;
for(i=1;i<=n;i++)
{ //找到接下来访问的位置
if(track[i].flag==-1)
if(abs(present-track[i].tn)<md)
{md=abs(present-track[i].tn);mdp=i;}
}
sum+=md;
present=track[mdp].tn;
track[mdp].flag=1;
add++;
a[z++]=track[mdp].tn;
}
printf("\n\n\n磁道访问顺序:");
for(j=1;j<=n;j++)
printf("%d ",a[j]);
printf("\n\n磁道移动总数sum=%d\n",sum);
printf("平均寻道总数=%lf\n",sum/(float)n);
}
int main()
{
int n;
int max,min,current;
printf("\t\t最短寻道时间优先\n\n");
printf("请输入请求进程的个数(1-50):");
scanf("%d",&n);
printf("请输入最小磁道号:");
scanf("%d",&min);
printf("请输入最大磁道号:");
scanf("%d",&max);
printf("请输入当前磁头所在的位置:");
scanf("%d",¤t);
randomnumber(n,max,min);
//for(int i=1;i<=N;i++) //检验产生的数是否符合要求
//printf("%d %d\n",track[i].tn,track[i].flag);
printf("\n磁道请求调度先后顺序为:\n");
for(int j=1;j<=n;j++)
printf("%d\t",track[j].tn);
SSTF(n,current,max,min);
return 0;
}