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

news2024/11/25 2:45:49

一、实验目的

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

二、实验内容

用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。
本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。实现的磁盘调度算法有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函数

四、程序流程图

在这里插入图片描述

五、实验代码

#include<stdio.h>
#include<math.h>
#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)输入初始指针所在磁道位置,选择FCFS算法
在这里插入图片描述

3)最短寻道时间优先算法(SSTF)
在这里插入图片描述

4)扫描算法(SCAN)由里向外
在这里插入图片描述

5)扫描算法(SCAN)由外向里
在这里插入图片描述

6)循环算法(C—SCAN)
在这里插入图片描述

七、实验体会总结

体会与总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大根堆 Java】使用优先队列+HashMap 解决前 K 个高频元素问题

一、题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 二、思路 本题我们主要完成两个步骤&#xff1a; 统计出每个元素出现的次数找出出现次数最多的前 K 个元素 对第一个步骤&#xf…

IPWorks S/MIME Delphi Edition

IPWorks S/MIME是一套用于电子邮件加密和文档安全的综合组件。IPWorks S/MIME使用公钥密码标准&#xff08;PKCS&#xff09;实现加密和解密的S/MIME标准。 IPWorks S/MIME包括通用的S/MIME组件以及支持S/MIME的IPWorks POP3、IMAP、SMTP、FileMailer和HTMLMailer组件版本。还…

【MMDet】提交PR的学习笔记

官方文档 关于如何向MMDet提交PR&#xff0c;请参考mmcv的文档《拉取请求 — mmcv 1.6.1 文档》 1. Fork最新代码库 当第一次提PR时&#xff0c;需要复刻OpenMMLab代码库&#xff0c;点击 GitHub 页面右上角的Fork按钮即可 将复刻的代码库克隆到本地 git clone fork_mmdet…

trunc函数与truncate函数的一点区别

Oracle的trunc函数与truncate函数都可以对数值进行截取操作 -- 首先看对数值进行截取操作 SELECT TRUNCATE(122.123, 4) from dual; # 122.123 SELECT TRUNCATE(122.123, 3) from dual; # 122.123 SELECT TRUNCATE(122.123, 2) from dual; # 122.12 SELECT TRUNCATE(122.123, 1…

vue3中使用element plus

1、先安装node.js node.js的安装_西瓜君的代码的博客-CSDN博客 2、安装vue-cli vue-cli的安装_西瓜君的代码的博客-CSDN博客 3、安装element-plus Element UI 安装_西瓜君的代码的博客-CSDN博客 4、idea中使用vue3 在idea中使用vue3_西瓜君的代码的博客-CSDN博客 5、 加入 impo…

分享从零开始学习网络设备配置--2.5 提高骨干链路带宽(链路聚合)

任务描述 某公司的网络中心为了接入网络稳定性&#xff0c;在汇聚层交换机的连接连路上使用了多条冗余链路&#xff0c;同时&#xff0c;为了增加带宽&#xff0c;多条冗余链路之间实现端口聚合&#xff0c;提高骨干链路的带宽&#xff0c;这样可以实现链路之间的冗余和备份效果…

Node.js v19,它来了。详解 6 大特性

通译自&#xff1a;6 Major Features of Node.js 19. Details of Node.js 19 new features… | by Jennifer Fu | Oct, 2022 | Better Programming Node 19 在 2022-10-18 发布。 我们知道 Node.js 版本分两种&#xff1a;LTS 和 Current 其中&#xff0c;Current 版本通常每 …

C语言第十课(下):优化井字棋游戏

目录 前言&#xff1a; 一、优手着棋判定&#xff1a; 1.防守型着棋优化&#xff1a; 2.进攻型着棋优化&#xff1a; 二、界面格式优化&#xff1a; 1.Sleep休眠语句&#xff1a; 2.system语句&#xff1a; 三、优化后最终全部代码&#xff1a; 1.头文件game.h: 2.函数功能…

MFIF:Deep Regression Pair Learning

DRPL: Deep Regression Pair Learning for Multi-Focus Image Fusion 本文提出了一种用于多焦点图像融合的新型深度网络&#xff0c;称为深度回归对学习 (DRPL)。与现有的深度融合方法将输入图像分割成小的补丁并应用分类器来判断补丁是否聚焦相比&#xff0c;DRPL直接将整个图…

java springboot获取GitLab上的文件内容

这里以最简单的方式获取git上的文件,并读取文件 第一步:获取主域名host 进入网页版的git,链接为:https://gitlab.***.com 第二步:获取access_token 在git网页端登录后的右上角用户头像下拉菜单的settings页面===>再点击settings页面的左侧菜单栏中的Access Tokens选…

Shell 脚本编程(二) —— 条件判断 (test命令) + 多路分支语句(if 、case)

test 命令可以用于判断文件类型以及值的比较&#xff0c;test 判断条件为真&#xff0c;返回 0&#xff1b;条件为假&#xff0c;返回 1。 目录 一、条件判断 (1) 整数判断 (2) 字符串判断 (3) 文件判断 二、if 语句 1、语法结构 2、实际运用 三、case语句 一、条件判断…

【毕业设计】图像识别跌倒检测算法研究与实现 - python 深度学习 机器学习

文章目录0 前言1 简介2 实现方法2.1 传统机器视觉算法2.2 基于机器学习的跌倒检测2.2.1 SVM简介2.2.2 SVM跌倒检测原理2.2.3 算法流程2.2.4 算法效果2.3 深度学习跌倒检测2.3.1 最终效果2.3.2 网络原理3 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成…

Java集合框架【二容器(Collection)[ArrayList]】

文章目录1 容器/集合简介2 容器的结构2.1 结构图2.1.1 单例集合2.1.2 双例集合3 单例集合的使用3.1 Collection接口的介绍3.2 Collection接口中的接口方法3.3 List接口3.3.1 List接口特点3.3.2List的常用方法3.4 ArrayList容器类3.4.1 添加元素3.4.2 获取元素3.4.3 根据索引删除…

水尺监测识别系统

水尺监测识别系统利用计算机视觉机器学习技术对河道湖泊进行实时检测&#xff0c;当水尺监测识别系统监测到河道水位异常时&#xff0c;立即告警。水尺监测识别系统同时将告警截图和视频保存下来&#xff0c;推送给后台。水尺监测识别系统极大提升现场区域的管控效率&#xff0…

android EventBus

EventBus使用小案例 文件目录结构 MainActivity.java package com.example.myeventbus;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import andro…

两万字长文带你深入Go语言GC源码

介绍 三色标记法 三色标记法将对象的颜色分为了黑、灰、白&#xff0c;三种颜色。 黑色&#xff1a;该对象已经被标记过了&#xff0c;且该对象下的属性也全部都被标记过了&#xff08;程序所需要的对象&#xff09;&#xff1b;灰色&#xff1a;该对象已经被标记过了&#…

一段JS去除畅言免费版广告

畅言广告怎么去掉&#xff1f;去除畅言免费版广告方法是什么&#xff1f;现在很多站长都使用的社会化评论系统&#xff0c;可以让网站拥有免费的评论区&#xff0c;活化你的网站&#xff0c;但是随着很多社会化评论提供网站的关闭&#xff0c;畅言一家独大&#xff0c;现在免费…

企业网络自动化配置

更新的技术、合规性标准和不断变化的业务需求使管理当今的网络成为一项具有挑战性的任务。这解释了网络自动化在当今世界的重要性。IT 管理员现在的任务是确保网络的敏捷性和演进不会影响提供给最终用户的网络服务的稳定性、可用性和可靠性。但是&#xff0c;在此任务中&#x…

【JMX】JMX远程监控JVM参数配置

目录基本用法命令示例jconsole连接新建连接确认连接方式查看监控信息jvisualvm连接添加主机增加JMX连接查看监控信息参数说明基本参数jmxremote.access文件说明jmxremote.password文件说明文件权限异常无法验证基本用法 命令示例 #参考命令 java -Dcom.sun.management.jmxrem…

【Java学习】语法:包、权限修饰符、final、常量、枚举、抽象类、接口

文章目录一、包二、权限修饰符三、final四、常量五、枚举六、抽象类七、接口一、包 什么是包? 包是用来分门别类的管理各种不同类的&#xff0c;类似于文件夹、建包利于程序的管理和维护。建包的语法格式: package公司域名倒写.技术名称。报名建议全部英文小写&#xff0c;且…