广州大学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

相关文章

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

Linux中查看操作系统及其版本信息的多种方法

《Linux中查看操作系统及其版本信息的多种方法》在服务器运维或者部署系统中,经常需要确认服务器的系统版本、cpu信息等,在Linux系统中,有多种方法可以查看操作系统及其版本信息,以下是一些常用的方... 目录1. lsb_pythonrelease 命令2. /etc/os-release 文件3. h

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象