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

广州大学2020操作系统实验五:磁盘管理实验_第1张图片
五份实验报告下载链接:click~

课程设计下载链接:click~

实验五 磁盘管理

        • 一、实验目的
        • 二、实验内容
        • 三、实验原理
          • 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)

广州大学2020操作系统实验五:磁盘管理实验_第2张图片

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

广州大学2020操作系统实验五:磁盘管理实验_第3张图片

扫描算法(SCAN)

广州大学2020操作系统实验五:磁盘管理实验_第4张图片

六、实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。

#include 
#include 
#include
#include 
#include 

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);
}

七、实验结果分析(截屏的实验结果,与实验结果对应的实验分析)

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

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

广州大学2020操作系统实验五:磁盘管理实验_第7张图片
(七)在这次实验中,SSTF与SCAN的移动磁道数目一致,但磁头不是刚好位于左边或者位于右边,而是位于中间,我们可以看到他们解决的磁道顺序是一致的,可以看到磁道0在这里起到了一个奇妙的化学反应,所以说,当一侧有少数极端的磁道,也可以使得这两种算法移动磁道数目一致。

广州大学2020操作系统实验五:磁盘管理实验_第8张图片
(八)上面说过,SSTF基本是移动磁道数目最少的,但不是绝对,在该次实验中,扫描算法SCAN通过先帮左边的一个磁道处理后,依次处理右边的磁道,比SSTF的移动磁道数目大大减少。

八、思考题

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

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

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

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

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

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

你可能感兴趣的:(实验项目,操作系统,Linux,广州大学)