(C语言实现)磁盘调度——最短寻道优先算法(SSTF)

一、设计目的:    

 加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法中的最短寻道优先算法。

二、设计内容
通过编程实现磁盘调度中最短寻道优先算法。
设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

最短寻道优先算法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;	
}

猜你喜欢

转载自blog.csdn.net/qq_41045071/article/details/80958221