操作系统 | 实验八 文件管理

一、实验目的

掌握文件的存取方法;掌握文件的逻辑结构和物理结构;掌握存储空间的分配和回收;掌握磁盘管理与调度。

二、实验内容

用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。
本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和 NStepSCAN算法。设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。按算法的寻道效率进行排序,并对各算法的性能进行分析比较。

三、数据结构

3.1 函数以及功能

函数名称 功能描述
void FCFS(int b[],int n,int init) 先来先服务算法(FCFS)
void SSTF(int b[],int n,int k) 最短寻道时间优先算法(SSTF)
void SCAN1(int b[],int n,int k) 扫描算法(SCAN)由外向里
void SCAN2(int b[],int n,int k) 扫描算法(SCAN)由里向外
void FCFS(int b[],int n,int init) 循环算法(C—SCAN)
int main() main函数

四、程序流程图

操作系统 | 实验八 文件管理_第1张图片

五、实验代码

#include
#include
#define SYSINFO "文件管理" // 系统信息 
#define AUTHOR "孤灯" //作者 

void FCFS(int b[],int n,int init)
{
	int i = 0;
	int s = 0;
	int sum = 0;
	int a[20];
	for(i = 0; i < n; i++)
	{
		a[i] = b[i];
	}
	s = init;
	sum = 0;
	for(i = 0; i < n; i++)
	{
		printf("第%d次访问的磁道:%d\n", i+1, a[i]);
		sum += abs(s - a[i]);
		printf("sum=%d\n", sum);
		s = a[i];
	}
	printf("平均寻道长度:%f\n", sum * 1.0 / n);
}

void SSTF(int b[],int n,int k)
{
	int i = 0;
	int j = 0;
	int s = 0;
	int sum = 0;
	int p = 0;
	int a[20];
	for(i = 0; i < n; i++)
	{
		a[i] = b[i];
	}

	for(i = n-1; i >= 0; i--)
	{
		s = a[0];
		p = 0;
		for(j = 0; j <= i; j++)
			if(abs(a[j] - k) < abs(s - k))
			{
				s = a[j];
				p = j;
			}
		a[p] = a[i];
		printf("第%d次访问的磁道:%d\n", n-i, s);
		sum += abs(s - k);
		printf("sum=%d\n", sum);
		k = s;
	}

	printf("平均寻道长度:%f\n",sum * 1.0 / n);
}

void SCAN1(int b[],int n,int k)
{
	int i = 0;
	int j = 0;
	int s = 0;
	int sum=0;
	int p = 0;
	int biaoji = 0;
	int a[20];
	for(i=0; i<n; i++)
	{
		a[i] = b[i];
	}

	for(i = n-1; i >= 0; i--)
	{
		biaoji = 0;
		for(j = 0; j <= i; j++)
		{
			if(a[j] - k <= 0)
			{
				biaoji=1;
				p=j;
				break;
			}
		}
		if(biaoji==1)
		{
			s=a[p];
			for(j=0; j<=i; j++)
				if(a[j]<k&&k-a[j]<k-s)
				{
					s=a[j];
					p=j;
				}
			a[p]=a[i];
			printf("第%d次访问的磁道:%d\n",n-i,s);
			sum+=k-s;
			printf("sum=%d\n",sum);
			k=s;
		}
		else
		{
			s=a[0];
			for(j=0; j<=i; j++)
				if(a[j]-k<=s-k)
				{
					s=a[j];
					p=j;
				}
			a[p] = a[i];
			printf("第%d次访问的磁道:%d\n",n-i,s);
			sum += abs(k-s);
			printf("sum=%d\n",sum);
			k = s;
		}
	}

	printf("平均寻道长度:%f\n",sum * 1.0 / n);
}

void SCAN2(int b[],int n,int k)
{
	int i = 0;
	int j = 0;
	int s = 0;
	int sum=0;
	int p = 0;
	int biaoji = 0;
	int a[20];
	for(i = 0; i < n; i++)
	{
		a[i] = b[i];
	}

	for(i = n - 1; i >= 0; i--)
	{
		biaoji = 0;
		for(j = 0; j <= i; j++)
		{
			if(a[j] - k >= 0)
			{
				biaoji = 1;
				p = j;
				break;
			}
		}
		if(biaoji == 1)
		{
			s = a[p];
			for(j = 0; j <= i; j++)
				if(a[j]>k&&a[j]-k<s-k)
				{
					s=a[j];
					p=j;
				}
			a[p]=a[i];
			printf("第%d次访问的磁道:%d\n",n-i,s);
			sum += s-k;
			printf("sum=%d\n", sum);
			k = s;
		}
		else
		{
			s = a[0];
			for(j = 0; j <= i; j ++)
			{
				if(k - a[j] <= k - s)
				{
					s = a[j];
					p = j;
				}
			}

			a[p] = a[i];
			printf("第%d次访问的磁道:%d\n", n - i, s);
			sum += abs(k - s);
			printf("sum=%d\n",sum);
			k = s;
		}
	}
	printf("平均寻道长度:%f\n",sum * 1.0 / n);
}

void  C_SCAN(int b[],int n,int k)
{
	int i = 0;
	int j = 0;
	int s = 0;
	int sum=0;
	int p = 0;
	int biaoji = 0;
	int a[20];
	for(i = 0; i < n; i++)
	{
		a[i] = b[i];
	}

	for(i = n-1; i >= 0; i--)
	{
		biaoji=0;
		for(j = 0; j <= i; j++)
		{
			if(a[j]-k <= 0)
			{
				biaoji=1;
				p=j;
				break;
			}
		}
		if(biaoji == 1)
		{
			s = a[p];
			for(j = 0; j <= i; j++)
			{
				if(a[j] < k && a[j] - k > s - k)
				{
					s = a[j];
					p = j;
				}
			}
			a[p] = a[i];
			printf("第%d次访问的磁道:%d\n", n-i, s);
			sum += s - k;
			printf("sum=%d\n", sum);
			k = s;
		}
		if(biaoji==0)
			break;
	}
	s = a[0];
	for(j = 0; j <= i; j++)
	{
		if(a[j] >= s)
		{
			s = a[j];
			p = j;
		}
	}

	a[p] = a[i];
	printf("第%d次访问的磁道:%d\n", n - i, s);
	sum += k - s;
	printf("sum=%d\n", sum);
	k = s;
	i --;
	for(i; i >= 0; i --)
	{
		s = a[0];
		for(j = 0; j <= i; j ++)
		{
			if(a[j] - k >= s - k)
			{
				s = a[j];
				p = j;
			}
		}
		a[p] = a[i];
		printf("第%d次访问的磁道:%d\n", n-i, s);
		sum += s - k;
		printf("sum=%d\n", sum);
		k=s;
	}

	printf("平均寻道长度:%f\n", sum * 1.0 / n);
}
int main()
{
	int a[20] = {0};
	int i = 0;
	int n = 0;
	int k = 0;
	int k1 = 0;
	int init = 0;
	printf("请输入需要访问的磁道总数:");
	scanf("%d", &n);
	printf("要输入的访问序列要有重复值和距离相等的值,例如:初始值为5,序列中必须含有5,4,6,这样的序列。\n");
	for(i = 0; i < n; i++)
	{
		printf("需要访问的磁道%d:",i+1);
		scanf("%d",&a[i]);
	}

	printf("请输入指针所在磁道:");
	scanf("%d",&init);
	k = 1;
	while(k)
	{
		printf("**********************************\n");
		printf("%s\nDesigned By:%s\n", SYSINFO, AUTHOR);
		printf("**1.先来先服务(FCFS)**\n");
		printf("**2.最短寻道时间优先(SSTF)**\n");
		printf("**3.扫描算法(SCAN)**\n");
		printf("**4.循环算法(C-SCAN)**\n");
		printf("**0.退出**\n");
		printf("**********************************\n");
		printf("请在下面输入您的选择:");
		scanf("%d", &k);
		switch(k)
		{
			case 1:
				FCFS(a, n, init);
				break;
			case 2:
				SSTF(a, n, init);
				break;
			case 3:
				k1=1;
				while(k1)
				{
					printf("**1.移动臂由里向外**\n");
					printf("**2.移动臂由外向里**\n");
					printf("**0.返回上一层**\n");
					printf("**********************************\n");
					printf("请在下面输入您的选择:");
					scanf("%d", &k1);
					switch(k1)
					{
						case 1:
							SCAN1(a, n, init);
							break;
						case 2:
							SCAN2(a, n, init);
							break;
					}
				}
			case 4:
				C_SCAN(a, n, init);
				break;
		}
	}

	return 0;
}


六、实验结果

1)输入访问的磁道数及需要访问的磁道
操作系统 | 实验八 文件管理_第2张图片

2)输入初始指针所在磁道位置,选择FCFS算法
操作系统 | 实验八 文件管理_第3张图片

3)最短寻道时间优先算法(SSTF)
操作系统 | 实验八 文件管理_第4张图片

4)扫描算法(SCAN)由里向外
操作系统 | 实验八 文件管理_第5张图片

5)扫描算法(SCAN)由外向里
操作系统 | 实验八 文件管理_第6张图片

6)循环算法(C—SCAN)
操作系统 | 实验八 文件管理_第7张图片

七、实验体会总结

体会与总结:

  • 此次实验思路简单,目的明确,就是集中文件管理方法的算法的代码实现,分为几种不同的算法,通过代码加以实现,从而实现文件管理。
  • 此次实验设计到四个文件管理算法,分别是先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、SCAN扫描算法、循环算法(C—SCAN)。
  • 先来先服务(FCFS):根据进程请求访问磁盘的先后次序进行调度。
  • 最短寻道时间优先(SSTF):其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
  • 扫描算法(SCAN):当磁头正在由里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样由里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向,由外向里移动。也叫电梯算法。
  • 通过此次实验加深了我对这几种算法的理解,以及熟悉了算法的流程,对这几种磁盘调度算法有了更清晰的认知。
  • 此次实验已经是操作系统这门课程的最后一次实验了,这次实验算是画上一个圆满的句号,这门课的句号,但是以后的逗号,行路并不止于此,路漫漫其修远兮,吾将上下而求索。

你可能感兴趣的:(操作系统,算法,操作系统,OS,数据结构,操作系统实验)