实验三 磁盘调度算法设计

news2024/10/6 18:27:41

实验三 磁盘调度算法设计

 

实验目的

通过对磁盘调度算法的设计,深入理解提高磁盘访问速度的原理。

实验内容:

模拟实现磁盘调度算法:最短寻道时间优先(SSTF)和扫描(SCAN)算法。

实验步骤:

理解各调度算法的工作原理

对给出的任意的磁盘请求序列、计算平均寻道长度;要求可定制磁盘请求序列长度、磁头起始位置、磁头移动方向。

测试:假设磁盘访问序列:98,183,37,122,14,124,65,67;读写头起始位置:53,方向:磁道增加的方向。输入此类数据后,程序按照选定的算法,自动给出访问序列,并且算出经过的磁道总数。

下面是具体的实验过程:

1.寻道时间优先(SSTF)算法

(1)寻道时间优先算法是要求被访问的磁道与当前磁头所在磁道距离最短,使得每次的寻道时间最短,但是不能保证最短的平均寻道时间。

2.扫描(SCAN)算法

(1)SCAN扫描算法不仅考虑欲访问的磁道与当前磁道之间的距离还优先考虑了当前磁道移动的方向。可以防止“饥饿”现象的发生。图2所示的为SCAN算法的流程图。

3.SSTF和SCAN算法代码

(1)代码目录结构图如图3所示。从上到小为SCAN算法实现,SSTF算法实现以及两个算法的测试类。

图3 代码结构目录图

(2)SSTF算法代码如下。主要的功能有SSTF算法的实现和磁道访问序列、磁道访问数、平均磁道访问数格式化输出。

public class SSTF {
	private int visit[];
	private int nearIndex=0;

	public int[] sstf(int queue[],int start){
		int nearNum=9999;
		visit=new int[queue.length];
		for(int i=0;i<queue.length;i++){
			for(int j=0;j<queue.length;j++){
				if(queue[j]!=-1){
					if(Math.abs(nearNum-start)>Math.abs(queue[j]-start)){
						nearNum=queue[j];
						nearIndex=j;
					}
				}
			}
			visit[i]=nearNum;
			queue[nearIndex]=-1;
			start=nearNum;
			nearNum=9999;
		}
	return visit;
	}	
public void print(int visit[],int start){
		double sum=0;
	
		System.out.print("访问序列:");
		for(int i=0;i<visit.length;i++){
			System.out.print(visit[i]+" ");
			sum=Math.abs(visit[i]-start)+sum;
			start=visit[i];
		}
		System.out.println();
		
		System.out.println("经过的磁道总数:"+sum);
		System.out.println("平均寻道长度:"+sum/visit.length);
	}
}

 (3)SCAN算法代码如下。主要的功能有SCAN算法的实现和磁道访问序列、磁道访问数、平均磁道访问数格式化输出。

public class SCAN{
	private int visit[];
	private int nearIndex=0;
	int nearNum=9999;
	public int[] scan(int queue[],int start,int direction){
		int index=0;
		visit=new int[queue.length];
		for(int i=0;i<queue.length;i++){
			index=-1;
			for(int j=0;j<queue.length;j++){
	
				if(queue[j]!=-1){
				
					if((direction==1)&&(queue[j]>start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){
						nearNum=queue[j];
						nearIndex=j;
						index=0;
					}
					else if((direction==0)&&(queue[j]<start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){
						nearNum=queue[j];
						nearIndex=j;
						index=0;
					}
				}
			}
			
			if((direction==1)&&(index==-1)){
				direction=0;
				i=i-1;
			}
			
			else if((direction==0)&&(index==-1)){
				direction=1;
				i=i-1;
			}
			
			if(index==0){
				visit[i]=nearNum;
				queue[nearIndex]=-1;
				start=nearNum;
				nearNum=9999;
			}
		}
		return visit;
	}

	public void print(int visit[],int start){
		double sum=0;
		System.out.print("访问序列:");
		for(int i=0;i<visit.length;i++){
			System.out.print(visit[i]+" ");
			sum=Math.abs(visit[i]-start)+sum;
			start=visit[i];
		}
		System.out.println();
		System.out.println("经过的磁道总数:"+sum);
		System.out.println("平均寻道长度:"+sum/visit.length);
	}

}

(4)测试类代码如下。主要完成的功能有磁盘调度算法的选择,磁盘请求序列长度的定义,磁盘请求访问序列的输入,起始位置的输入,调用对应的算法输入磁盘访问序列和磁道总数以及平均寻道长度。

//测试的序列98 183 37 122 14 124 65 67
public class Test {
	public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	boolean f=true;
	int[] queue=null;//磁盘访问序列
	int start=0;//当前磁头所在的位置
	while(f) {
		System.out.println("输入要执行的磁盘调度算法\n"
				+ "1---代表SSTF算法\n"
				+ "2---代表SCAN算法\n"
				+ "3---代表退出系统");
		String flag=sc.next();
		switch(flag) {
		case "1":
			System.out.println("请输入磁盘请求序列长度:");
			int count=sc.nextInt();
			queue=new int[count];//访问序列
			System.out.println("请输入磁盘请求访问序列:");
			for(int i=0;i<count;i++){
				queue[i]=sc.nextInt();//初始化访问序列
			}
			SSTF sstf=new SSTF();
			System.out.println("请输入读写头起始位置:");
		    start=sc.nextInt();
			sstf.print(sstf.sstf(queue, start),start);
System.out.println("*******************分割线*******************");
		break;
		case "2":
			System.out.println("请输入磁盘请求序列长度:");
			int length=sc.nextInt();//length请求队列长度
			System.out.println("请输入磁盘请求访问序列:");
			queue=new int[length];//queue磁盘访问队列的长度
			for(int i=0;i<length;i++){
			queue[i]=sc.nextInt();//初始化此磁盘队列
			}
			SCAN scan=new SCAN();//创建SCAN对象
			System.out.println("请输入读写头起始位置:");
			start=sc.nextInt();//strat为读写磁头所在的位置
System.out.println("磁道增加的方向:(0向磁道号减少的方向移动,1向磁道号增加的方向移动)");
			int direction=sc.nextInt();//输入方向
scan.print(scan.scan(queue, start,direction),start);//打印磁道访问序列,磁道数和平均访问的次数
System.out.println("*******************分割线*******************");
			break;
		case "3":
			f=false;//退出
			System.out.println("欢迎您的下次使用!");
System.out.println("*******************分割线*******************");
			break;
			default:
			f=false;
System.out.println("对不起,您的输入有误,欢迎您的下次使用!");
System.out.println("*******************分割线*******************");
				break;
			}
		}
	}
}

运行,经过验证可知结果正确。

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

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

相关文章

数字化转型导师坚鹏:企业数字化转型培训如何高效推进评价与改进

企业数字化转型培训如何高效推进、评价与改进 ——以推动企业数字化转型战略落地为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业都在开展企业数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 不清楚如何有效推进企业数字化转型培训…

JavaScript 箭头函数

&#xff08;许多人所谓的成熟&#xff0c;不过是被习俗磨去了棱角&#xff0c;变得世故而实际了。那不是成熟&#xff0c;而是精神的早衰和个性的消亡。真正的成熟&#xff0c;应当是独特个性的形成&#xff0c;真实自我的发现&#xff0c;精神上的结果和丰收。——周国平&…

Vue|内置指令

Vue的内置指令是带有v-前缀的特殊属性&#xff0c;它的作用是当表达式的值改变时将其一系列连带影响&#xff0c;响应地作用于DOM元素。 推荐专栏&#xff1a;微信小程序实战开发专栏 内置指令v-text指令v-html指令v-cloak指令v-once指令v-pre指令 内置指令 开始前的准备&#…

虹科方案 | CEMEX 使用HK-Edgility 智能边缘计算平台简化其企业 WAN 管理和运营

一、应对价值 130 亿美元的跨国企业的网络挑战 “我们选择 Edgility 是因为其卓越的管理和协调功能&#xff0c;它为我们提供了一个端到端的工具集&#xff0c;可以经济高效地部署和管理我们边缘设备的生命周期。” —— Fernando Garcia -Villaraco Casero, CEMEX 全球IT 战略…

玩家必看!这三款简单好玩的免费小游戏平台!

在这个飞速发展和高度竞争的时代&#xff0c;人们的日程表已经被各种事情排满。时间的紧迫使得我们不可能一刻都停歇下来&#xff0c;正因为如此&#xff0c;我们才需要适当地放慢自己的步伐&#xff0c;寻找些许休闲娱乐的机会来放松自己。 现如今&#xff0c;越来越多的小游…

VSAN 6.7虚拟机精简置备盘空间不回收

原创作者&#xff1a;运维工程师 谢晋 VSAN 6.7虚拟机精简置备盘空间不回收 前提 前提 客户VSAN6.7环境&#xff0c;做了Horzion7.4&#xff0c;近期发现虚拟机存储空间越来越大&#xff0c;远远超过了已分配的磁盘空间大小&#xff0c;发现是数据写入系统内即使删除了数据…

25个著名的WordPress网站案例

想创建免费网站吗&#xff1f;从易服客建站平台开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 WordPress 内容管理系统为全球35%的网站提供支持。鉴于目前有 17 亿个站点&#xff0c;并且还在增加&#xff0c;您可以算出每秒向网站访问者提供内容的W…

【C++】map和set的介绍+使用

前言&#xff1a; 我们前面一起学习了二叉搜索树&#xff0c;这便是为了引入本章我们所学的map和set容器。map和set的底层实现就和二叉搜索树有关... 目录 &#xff08;一&#xff09;键值对的引入 &#xff08;1&#xff09;关联式容器 &#xff08;2&#xff09;键值对 …

NVIDIA GPU Driver, CUDA 和 PyTorch的版本关系

我们在进行深度学习环境配置的时候&#xff0c;会遇到各种各样的问题。有各种各样的驱动、包需要安装。不同驱动和包之间的还存在版本适配问题&#xff0c;刚入手的同学会一脸懵逼。配置环境成了入门的第一道门槛。我现在总结了NVIDIA 显卡 Anaconda资源库 PyTorch深度学习框…

Packet Tracer - 配置扩展 ACL - 场景 2

Packet Tracer - 配置扩展 ACL - 场景 2 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.101.117.49 255.255.255.248 不适用 G0/1 10.101.117.33 255.255.255.240 不适用 G0/2 10.101.117.1 255.255.255.224 不适用 PCA NIC 10.101…

No primary or single public constructor found for interface java.util.List

我的爆错原因是途中ids忘记标注注解PathVariable了&#xff0c;因为要传入一系列的整数的列表对象到路径/emps/deleteEmps/{ids}中&#xff0c;所以我这里就是加上注解PathVariable就OK了。

TAPD使用规范

目录 https://www.bilibili.com/?spm_id_from333.788.0.0我该如何理解这段网址&#xff1f; ?spm_id_from333.788.0.0&#xff1a;表示查询字符串&#xff0c;用于向服务器传递额外的参数信息。在这个例子中&#xff0c;该查询字符串可能用于追踪网站访问来源或统计数据分析…

windows权限维持之计划任务

schtasks常用参数: /Create 创建新计划任务。 /Delete 删除计划任务。 /Query 显示所有计划任务。 /Change 更改计划任务属性。 /Run 按需运行计划任务。 /End 中止当前正在运行的计划任务。 …

会声会影2023旗舰版升级更新及新增功能讲解

会声会影2023新版增加了众多新功能&#xff0c;在海外同样引起了很多关注。每年会声会影更新他都会制作一条&#xff0c;今年的你也不容错过&#xff0c;相信你看完对2023版会声会影将更有兴趣升级~ 建议2022版之前的老朋友&#xff0c;一定要升级2023版&#xff0c;在程序的性…

Linux的字符集及编码

Linux 字符集设置 1、查询 (1) 查看当前服务器字符集: # locale (2) 查看服务器支持的字符集: # locale -a 2、修改linux系统字符集的方式有如下两种&#xff1a; (1) 直接设置变量的方式修改&#xff0c;命令如下两条命令&#xff1a; [root~]# LANG"xxx" 或者…

人脉社交社群运营系统源码

人脉社交社群运营需要注意以下几个方面&#xff1a; 社群定位&#xff1a;要明确社群的目标人群、服务内容和特点&#xff0c;以便吸引到符合社群需求的用户。 内容策划&#xff1a;需要提供丰富、有趣、有价值的内容&#xff0c;如文章、图片、视频等&#xff0c;以增…

鸿蒙Hi3861学习八-Huawei LiteOS(事件标记)

一、简介 事件是一种实现任务间通信的机制&#xff0c;可用于实现任务间的同步。但事件通信只能是事件类型的通信&#xff0c;无数据传输。一个任务可以等待多个事件的发生&#xff1a;可以是任意一个事件发生时唤醒任务进行事件处理&#xff1b;也可以是几个事件都发生后才唤醒…

​#立夏# 气温升高,3招提高电路板的散热效率!

电路板是电子设备的核心&#xff0c;上面安装了各种元器件&#xff0c;如电阻、芯片、三极管等。这些元器件在工作时都会产生一定的热量&#xff0c;从而使电路板的温度升高。如果不及时将这些热量散发出去&#xff0c;电路板就会过热&#xff0c;影响元器件的性能、可靠性和寿…

Mysql进阶(一)Mysql执行流程与架构

文章目录 一句查询语句是如何执行的&#xff1f;通信协议通信方式查询缓存词法语法解析和预处理&#xff08;解析器、预处理器&#xff09;查询优化器与查询执行计划什么是优化器优化器可以做什么优化器执行结果 存储引擎基本介绍存储引擎比较如何选择存储引擎 一条更新SQL是如…

java语法(一)基本概念、数据类型、字符串类、集合

文章目录 java程序运行流程JDK、JRE、JVM的关系 java数据类型基本数据类型基本数据类型之间的转换 引用数据类型数组类Java Bean重写 equals和hashcode 接口接口与类之间的关系 内置包装类装箱和拆箱包装类的应用Object类toString()equals()方法getClass() 方法接收任意引用类型…