- 实验内容:
要求模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法三种磁盘调度算法,输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数
测试样例(磁头起始位置是53)
8
98 183 37 122 14 124 65 67
#include<iostream>
#include<ctime>
#include<algorithm>
using namespace std;
int num; //磁道访问序列数目
int * disk;//储存磁道访问序列的一维数组
int head;//磁头最初的位置
int totalMove;//移动总磁道数
int * path;//储存移动路径
bool * mark;//标记磁道是否访问过
/*快速排序,对数组a[]的下标start-end的元素从小到大排序*/
void quickSort(int *a , int start , int end){
if(start < end){
int k =a[start];
int i =start, j = end;
while(i < j ){
while(i <j && a[j] >= k)
j--;
swap(a[i], a[j]);
while(i < j && a[i] <= k)
i++;
swap(a[i], a[j]);
}
quickSort(a, start, j -1);
quickSort(a, j + 1, end);
}
}
void init(){
for(int i = 0; i < num; i++)
path[i] = -1;//初始路径
totalMove = 0;//总移动次数是0
mark = new bool[num + 2];//标记数组
}
void FCFS(const int & head ){//先来先服务
init();
for(int i = 0; i < num; i++)//路径就是移动轨迹了
path[i] = disk[i];
int p = head;
for(int i = 0; i < num; i++){//求移动总磁道数
totalMove += abs((disk[i] - p));
p = disk[i];
}
return ;
}
void SSTF(const int & head){//最短寻道时间优先
init();
for(int i = 0; i < num; i++)//初始所有磁道disk[i]没有走过
mark[i] = false;
int min;//记录离当前磁头最近的磁道的下标
int minDist;//记录离当前磁头最近的磁道的距离
int p = head;//磁头
int now = 0;//路径指针
while(true){
min = -1;//初始min 和 minDist
minDist = INT_MAX;
for(int i = 0; i < num; i++){
if(mark[i] == false && ( abs(disk[i] - p) < minDist) ){//如果disk[i]没走过且距离磁头更近
min = i;//记录并更新
minDist = abs(disk[i] - p);
}
}
if(min == -1)//所有磁道访问序列走完了程序退出循环结束
break;
totalMove += minDist;//增加移动总磁道数
p = disk[min];//更新当前磁头位置
mark[min] = true;//标记该磁道被访问了
path[now++] = disk[min];//添加到路径
}
return ;
}
void calBackward(int start ){//向0磁道的方向移动
//mark[start] = true;
int now = 0;
int p = start;
for(int i = start - 1; i >= 0; i--){/*统计向0磁道的移动次数*/
totalMove += abs(disk[i] - disk[p]);
p = i;
path[now++] = disk[i];//记录路径
//mark[i] = true;
}
for(int i = start+ 1; i < num + 1; i++){/*统计向199磁道移动次数*/
totalMove += abs(disk[i] - disk[p]);
p = i;
path[now++] = disk[i];
}
return ;
}
void calForward(int start ){//向199磁道的方向移动(向磁道号增大的方向移动)
int now = 0;
int p = start;
for(int i = start + 1; i < num + 1; i++){
totalMove += abs(disk[i] - disk[p]);
p = i;
path[now++] = disk[i];
}
for(int i = start - 1; i >=0; i--){
totalMove += abs(disk[i] - disk[p]);
p = i;
path[now++] = disk[i];
}
return ;
}
void elevator(const int & head){//电梯法
init();
int choice;
int pos = -1;
cout<<"输入当前磁头移动方向, 输入 0 表示磁头当前正向0道方向移动,否则是向199道方向移动"<<endl;
cin>>choice;
disk[num] = head;//丢入寻道序列
//sort(disk, disk + num + 1);//对这 num + 1 个元素排序
quickSort(disk, 0, num);
for(int i = 0; i < num + 1; i++){//找到排序后磁头所在的位置
if(disk[i] == head)
pos = i;
}
if(choice == 0){//向0磁道方向移动
calBackward(pos);
}
else
calForward(pos);
return ;
}
void output(){/*输出移动轨迹*/
cout<<"移动轨迹为:"<<endl;
cout<<head<<"->";
for(int i = 0; i < num - 1; i++){
cout<<path[i]<<"->";
}
cout<<path[num - 1]<<" ";
cout<<"移动的总磁道数目为: "<<totalMove<<endl;
}
int main(){
cout<<"请输入 多少道请求访问磁道序列"<<endl;
cin>>num;
disk = new int[num + 2];//磁盘序列
path = new int[num +2];//储存路径
cout<<"输入磁道请求访问序列"<<endl;
for(int i = 0; i < num; i++){
cin>>disk[i];
}
cout<<"请输入磁头初始所在的磁道"<<endl;
cin>>head;
cout<<"/*******利用先来先服务方法*******/"<<endl;
FCFS(head);//先来先服务法
output();//输出轨迹
cout<<"///-----------------------------------------------"<<endl;
cout<<"/*******利用最短寻道时间优先法*******/"<<endl;
SSTF(head);//最短寻道优先法
output();
cout<<"///-----------------------------------------------"<<endl;
cout<<"/*******利用电梯法*******/"<<endl;
elevator(head);//电梯法
output();
system("pause");
}