实验4 磁盘调度
一、实验内容
模拟电梯调度算法,实现对磁盘的调度。
二、实验目的
磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫磁盘调度,使用的算法称磁盘调度算法。磁盘调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个磁盘调度程序,观察磁盘调度程序的动态运行过程。
三、实验原理
磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫磁盘调度,使用的算法称磁盘调度算法。磁盘调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个磁盘调度程序,观察磁盘调度程序的动态运行过程。
四、算法流程图
五、源程序及注释
#include <bits/stdc++.h>
using namespace std;
#define MaxNumber 200
int StartTrack;//开始磁道
int TrackOrder[MaxNumber];//初始磁道序列
int VisitOrder[MaxNumber];//访问磁道序列
bool Visited[MaxNumber];//标记是否被访问过
int MoveDistance[MaxNumber];//磁头移动磁道数
int Sum_Distance;//磁头移动的总距离
double AverageDistance;//磁头平均移动距离
bool direction;//选择磁头向内或向外方向
//计算与当前所在磁道距离的绝对值
int Absolute(int a, int b){
if (a - b > 0)
return (a - b);
else
return (b - a);
}
void initial(){//全部数据初始化
for (int i = 0; i < 15; i++){
MoveDistance[i] = 0;
VisitOrder[i] = TrackOrder[i];
Visited[i] = false;
}
Sum_Distance = 0;
AverageDistance = 0;
}
void display(){//打印
cout << "Start: " << StartTrack << endl;
cout << "Next\tDistance\t" << endl;
for(int i = 0; i < 15; i++)
cout << VisitOrder[i] << "\t" << MoveDistance[i] << "\t" << endl;
cout << "AverageDistance: " << setprecision(4) << AverageDistance << endl;
}
//开始磁道沿选择方向扫描,直到没有要访问的磁道后沿反方向扫描
void SCAN(){
cout << endl << "SCAN" << endl;
cout << "Choose direction,0-add,1-reduce: " << endl;
cin >> direction;
initial();
int SortTrackOrder[MaxNumber];
for (int i = 0; i < 15; i++)
SortTrackOrder[i] = TrackOrder[i];
sort(SortTrackOrder, SortTrackOrder + 15);
//找到距离最近的磁道号
int point = 0;
while(StartTrack >= SortTrackOrder[point++]) ;
int count = 0;
int currentTrack = StartTrack;
if (direction == 0){ //向磁道增加的方向访问
cout << "add" << endl;
for (int i = point; i < 15; i++){
VisitOrder[count] = SortTrackOrder[i];
MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
currentTrack = VisitOrder[count];
count++;
}
for (int i = point - 1; i >= 0; i--){
VisitOrder[count] = SortTrackOrder[i];
MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
currentTrack = VisitOrder[count];
count++;
}
}
else if (direction == 1){ //向磁道减少的方向访问
cout << "reduce" << endl;
for (int i = point - 1; i >= 0; i--){
VisitOrder[count] = SortTrackOrder[i];
MoveDistance[count] = Absolute(VisitOrder[count], currentTrack);
currentTrack = VisitOrder[count];
count++;
}
for (int i = point; i < 15; i++){
VisitOrder[count] = SortTrackOrder[i];
MoveDistance[count] = Absolute(VisitOrder[count],currentTrack);
currentTrack = VisitOrder[count];
count++;
}
}
//求和计算平均寻址距离
for (int i = 0; i < 15; i++)
Sum_Distance += MoveDistance[i];
AverageDistance = (Sum_Distance * 1.0) / 15;
display();
}
int main(){
srand((unsigned int)time(0));//用伪随机数初始化磁道序列
for(int i = 0; i < 15; i++){
TrackOrder[i] = rand() % 200 + 1;
cout<< TrackOrder[i] << " ";
}
cout << endl;
cout << "Enter StartTrack: ";
cin >> StartTrack; //输入开始磁道号
cout << endl;
SCAN();
return 0;
}
六、打印的程序运行时初值和运行结果
七、实验小结
通过本次实验初步实现了电梯调度算法对磁盘调度的模拟。使我加深了对电梯调度算法的理解,加强了用代码模拟实现的能力。同时在写程序前先做好流程图,写出大概步骤与将操作模块化都对代码的实现与完成起了很大帮助,体会到提前做准备的帮助和好处。此次实验代码量小于前几次实验,实现难度较之前小一些,所以花费的时间主要在debug和完善上。