广州大学2020操作系统实验五:磁盘管理实验

2023-11-05 22:40

本文主要是介绍广州大学2020操作系统实验五:磁盘管理实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

相关资料

广州大学2020操作系统实验一:进程管理与进程通信
广州大学2020操作系统实验二:银行家算法
广州大学2020操作系统实验三:内存管理
广州大学2020操作系统实验四:文件系统
广州大学2020操作系统实验五:磁盘管理实验
五份实验报告下载链接🔗

课程设计下载链接🔗

实验五 磁盘管理

      • 相关资料
        • 一、实验目的
        • 二、实验内容
        • 三、实验原理
          • 1、先来先服务算法(FCFS)
          • 2、最短寻道时间优先算法(SSTF)
          • 3、扫描算法(SCAN)
        • 四、实验中用到的系统调用函数(包括实验原理中介绍的和自己采用的),自己采用的系统调用函数要按照指导书中的格式说明进行介绍。
        • 五、实验步骤
          • 先来先服务算法(FCFS)
          • 最短寻道时间优先算法(SSTF)
          • 扫描算法(SCAN)
        • 六、实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。
        • 七、实验结果分析(截屏的实验结果,与实验结果对应的实验分析)
        • 八、思考题
          • 1、通过对每个算法进行时间复杂度分析对比,每个算法的效率如何?
          • 2、若所有硬盘全部设计成电子硬盘,哪个磁盘调度算法最合适?

一、实验目的

1、了解磁盘调度的策略和原理;
2、理解和掌握磁盘调度算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、电梯扫描算法(SCAN)。

二、实验内容

1、模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯扫描算法(SCAN)三种磁盘调度算法;
2、对三种算法进行对比分析。
3、输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。

三、实验原理
1、先来先服务算法(FCFS)

按先来后到次序服务,未作优化。最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。

2、最短寻道时间优先算法(SSTF)

最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。

3、扫描算法(SCAN)

SCAN 算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。

四、实验中用到的系统调用函数(包括实验原理中介绍的和自己采用的),自己采用的系统调用函数要按照指导书中的格式说明进行介绍。

实验只是模拟实现文件的备份功能,不需要系统调用函数。

五、实验步骤

1、 输入为一组请求访问磁道序列,该序列和所选磁道个数要求随机生成,输出为每种调度算法的磁头移动轨迹和移动的总磁道数;
2、在0~199范围内随机生成调用的磁道,每次生成的磁道数不少于10个,生成不同情况下的磁道组合。
3、实验主程序流程图

先来先服务算法(FCFS)

在这里插入图片描述

最短寻道时间优先算法(SSTF)

在这里插入图片描述

扫描算法(SCAN)

在这里插入图片描述

六、实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include <string.h>
#include <time.h>int N; //磁道个数
int start; //磁头的位置
int *Seq; //请求服务序列void init(); //随机初始化测试数据
void release(); //进程完成,释放资源
void FCFS(); //先来先服务算法(FCFS)
void SSTF(); //最短寻道时间优先算法(SSTF)
void SCAN(); //扫描算法(SCAN)
void QuickSort(int *q, int left, int right); //快速排序
int Part(int *p, int low, int high);
int main()
{
srand((unsigned long)time(0)); //产生随机数种子 
init(); //随机初始化测试数据printf("先来先服务算法(FCFS):");
FCFS();printf("最短寻道时间优先算法(SSTF):");
SSTF();printf("扫描算法(SCAN):");
SCAN();release(); //释放资源
}void SCAN()
{
int i,flag,temp,steps;
QuickSort(Seq,0,N-1); //升序排序
for(i=0;i<N;i++) 
if(Seq[i]>start){
flag=i;
break;
}
int direction = rand()%2; //随机初始化磁头方向,0为左边,1为右边if(direction == 0){
for(i=0;i<(flag/2);i++) //往小的走,将小的翻转
{ temp =Seq[flag-1-i];
Seq[flag-1-i] = Seq[i];
Seq[i] = temp;
}
for(i=0;i<N;i++) //正序
printf(" %d",Seq[i]);
steps = abs(Seq[0]-start);
for(i=0;i<N-1;i++)
steps+=abs(Seq[i+1]-Seq[i]);
printf("移动%d个磁道\n",steps);
}
else{
for(i=flag;i<(flag+(N-flag)/2);i++) //往大的走,将大的翻转
{ temp =Seq[N-i+flag-1];
Seq[N-i+flag-1] = Seq[i];
Seq[i] = temp;
}
for(i=N-1;i>=0;i--)
printf(" %d",Seq[i]); //逆序steps = abs(Seq[N-1]-start);
for(i=N-1;i>0;i--)
steps+=abs(Seq[i-1]-Seq[i]);
printf("移动%d个磁道\n",steps);
} 
}int Part(int *p, int low, int high) //快速排序
{
int i = low, j = high, pivot = p[low];
while (i < j)
{
while (i < j&&p[j] >= pivot)
{
j--;
}
if (i < j)
{
p[i] = p[j];
i++;
}
while (i < j&&p[i] <= pivot)
{
i++;
}
if (i < j)
{
p[j] = p[i];
j--;
}
}
p[i] = pivot;
return i;
}
void QuickSort(int *q, int left, int right)
{
if (left < right)
{
int pivot = Part(q, left, right);
QuickSort(q, left, pivot - 1);
QuickSort(q, pivot + 1, right);
}
}void SSTF()
{
int steps=0,move=start,i,j,flag,step=1000000;
int *record = malloc(sizeof(int) * N); //记录是否已服务
for(i=0;i<N;i++)record[i]=0; for(j=0;j<N;j++){
for(i=0;i<N;i++){
if(record[i]==0)
if(step>abs(Seq[i]-move)){
step = abs(Seq[i]-move);
flag = i;
}
}
steps+=step;
record[flag]=1;
move= Seq[flag];
step=1000000;
printf(" %d",move);
}
printf("移动%d个磁道\n",steps);
}void FCFS()
{
int steps=0,i;
steps = abs(Seq[0]-start);
for(i=0;i<N-1;i++)
steps+=abs(Seq[i+1]-Seq[i]);
printf("移动%d个磁道\n",steps);
}void init()
{ 
int i;
N = 10; //初始化磁道个数
start = rand()%200; //随机初始化磁头位置Seq = malloc(sizeof(int) * N); //请求访问磁道序列
for(i=0;i<N;i++)
Seq[i]=rand()%200;printf("初始化%d个磁道个数,序列如下:",N);
for(i=0;i<N;i++)
printf("%d ",Seq[i]);
printf("\n磁头的位置位于%d\n",start);
}void release() //进程完成,释放资源
{
free(Seq);
}
七、实验结果分析(截屏的实验结果,与实验结果对应的实验分析)

在这里插入图片描述
(一)FCFS不考虑远近,只考虑先后,基本是移动最多的。
(二)SSTF对当前序列进行一个排序,从当前的位置寻找距离最短的磁道进行移动,所以基本是移动最少的。
(三)SCAN考虑了请求队列具有动态性质,因此兼顾了以上两种算法,以磁头目前的移动方向一直移动下去,直到该方向上没有磁道需要移动,再往反方向移动。
在这里插入图片描述
(四)FCFS依然是移动最多的。
(五)这次实验的结果显示,SSTF与SCAN的移动磁道数目一致,这是因为磁头刚好位于请求队列内所有磁道的左边,因此移动的磁道数目相同。
(六)同理,磁头刚好位于请求队列内所有磁道的右边,SSTF与SCAN移动的磁道数目也相同。

很明显,每次FCFS移动都是最多的,接下来,我们重点关注SSTF与SCAN的区别。

在这里插入图片描述
(七)在这次实验中,SSTF与SCAN的移动磁道数目一致,但磁头不是刚好位于左边或者位于右边,而是位于中间,我们可以看到他们解决的磁道顺序是一致的,可以看到磁道0在这里起到了一个奇妙的化学反应,所以说,当一侧有少数极端的磁道,也可以使得这两种算法移动磁道数目一致。

在这里插入图片描述
(八)上面说过,SSTF基本是移动磁道数目最少的,但不是绝对,在该次实验中,扫描算法SCAN通过先帮左边的一个磁道处理后,依次处理右边的磁道,比SSTF的移动磁道数目大大减少。

八、思考题
1、通过对每个算法进行时间复杂度分析对比,每个算法的效率如何?

先来先服务算法(FCFS):
该算法没什么花费,来一个处理一个。但是对物理硬件是个巨大考验,需要移动的磁道数目过多。

最短寻道时间优先算法(SSTF):
该算法主要花费在确定最短移动的目标磁道上,需要遍历n次获得最小值对应的目标磁道,该算法在实际实现中有个缺点就是太远的磁道可能长期不能获得服务。

扫描算法(SCAN):
该算法主要花费在快排上,只要快排定位好当前的位置,效率最会很快,并且符合请求队列具有动态性质等规则,并且解决了以上算法的弊端。

2、若所有硬盘全部设计成电子硬盘,哪个磁盘调度算法最合适?

电子硬盘不存在物理寻磁道的操作,因此选择算法复杂度最简单的先来先服务算法(FCFS)。

这篇关于广州大学2020操作系统实验五:磁盘管理实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352931

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd