一、算法思想
电梯算法与扫描算法类似,但磁头不会每次都移动到柱面尽头,一旦当前方向上没有访问请求但相反方向上有请求时,就改变磁头臂的移动方向继续处理。电梯算法的本质是一个具有方向约束的最短寻道时间优先算法(SSTF算法)。
二、算法具体设计问题
由于本实验是算法的模拟实验,所以磁盘调度算法并不真正地去处理请求,只是依据给定的柱面访问序列依照某一种具体的查找优化算法进行模拟访问。算法需要输出柱面访问顺序和移动柱面的总数。
三、算法代码实现
#include <iostream>
#include <stdlib.h>
#include<algorithm>
#include<math.h>
#define maxnum 100
using namespace std;
int SCAN(int visitlist[maxnum],int list[maxnum],int pos,int direct,int Num)
{sort(visitlist,visitlist+Num);//先对访问柱面进行排序int sum=0,flag=0;for(int i=0;i<Num;i++)//找到当前访问柱面号的位置{if(visitlist[i]>=pos){flag=i;break;}}if(direct==0){//向外访问,是先访问大于pos的第一个位置到最大//之后访问小于pos第一个位置到最小 copy(visitlist+flag,visitlist+Num,list);copy(visitlist,visitlist+flag,list+Num-flag);reverse(list+Num-flag,list+Num);}else{//向外访问,是先访问小于pos的第一个位置到最小//之后访问大于pos第一个位置到最大 copy(visitlist,visitlist+flag,list);copy(visitlist+flag,visitlist+Num,list+flag);reverse(list,list+flag);}for(int i=0;i<Num-1;i++)sum+=abs(list[i]-list[i+1]);return sum;
}
void guide()
{int Num,pos,direct,sum;int visitlist[maxnum];int list[maxnum];cout<<"请输入带访问的柱面数:";cin>>Num;cout<<"请输入移动臂移动方向,1表示由外向里,0表示由里向外:";cin>>direct;cout<<"请依次输入带访问的柱面号:";for(int i = 0; i < Num; i++)cin>>visitlist[i];cout<<"请输入磁头当前刚完成访问的柱面号:";cin>>pos;sum=SCAN(visitlist,list,pos,direct,Num);cout<<"\n待访问柱面号\n";for(int i = 0; i < Num; i++)cout<<visitlist[i]<<" ";cout<<"\n访问序列\n";for(int i = 0; i < Num; i++)cout<<list[i]<<" ";cout<<"\n总移动距离\n"<<sum;
}int main()
{
guide();return 0;
}
四、实验结果