操作系统实验——磁盘调度算法(FIFS SSTF SCAN)
一、实验目的
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、输入为一组请求访问磁道序列,该序列和所选磁道个数要求随机生成,输出为每种调度算法的磁头移动轨迹和移动的总磁道数;
srand((int)time(NULL));
cout << "请输入生成的访问磁道进程数量:";
int n, m, p=0;
int flag ;
string direction;
cin >> n;
int a[100];
for (int i = 0; i < n; i++)
{
a[i] = rand() % 1000;
}cout << "生成的访问进程为:";
for (int i = 0; i < n; i++)
{
if (i % 5 == 0)
{
cout << endl;
}
cout << a[i] << " ";
}
2、输入磁道范围 0~1000 ,输入所选磁道个数0~1000;
3、画出主程序流程图;
源代码:
include <iostream>
#include<cstdlib>
#include <time.h>
using namespace std;
class DISK
{
private:
int Movedistance;//移动距离
int Lable[100];//标号指针
string Movedirection;//移动方向
public:
int Calculate_Diference(int a, int b)//计算移动距离(差值的绝对值)
{
return (a - b > 0 ? a - b : b - a);
}
void ShowPath(int a[], int x, int len)//调度过程 时间复杂度O(n)
{
cout << "从" << x << "号磁道开始" << endl;
for (int i = 1; i < len + 1; i++)
{
cout << "下一个访问的磁道号:" << a[i] << "\t移动的距离:" << Calculate_Diference(a[i], a[i - 1]) << endl;
}
}
void CalculateMoveDistance(int a[