先简单介绍一下这几种算法:
1、先来先服务:最早提交最早访问。
例如:磁盘访问序列:98,183,37,122,14,124,65,67。
读写头起始位置:53磁道处。
走道顺序:53,98,183,37,122,14,124,65,67
磁头走过的总道数:640
2、最短寻道时间优先:离读写头最近的最早访问。
例如:磁盘访问序列:98,183,37,122,14,124,65,67。
读写头起始位置:53磁道处。
走道顺序:53, 65,67,37,14,98, 122, 124, 183
磁头走过的总道数:236
3、电梯算法:先访问读写头以下的,再访问读写头以上的。
例如:磁盘访问序列:98,183,37,122,14,124,65,67。
读写头起始位置:53磁道处。
走道顺序:53, 37,14, 65,67, 98, 122, 124, 183
磁头走过的总道数:=(53-14)+(183-14)= 208
源代码:
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
#define NUM 8
void Read(int *a,int &head)
{ cout<<"磁盘访问序列:";
for(int i=0;i<NUM;i++)
cin>>a[i];
cout<<"\n磁头位置:";
cin>>head;
}
void Write(int *a,int &sum,int &head)
{ cout<<"走道顺序:"<<head<<" ";
for(int i=0;i<NUM;i++)
cout<<a[i]<<" ";
cout<<"\n磁头走过总道数:"<<sum;
}
void FCFS(int head,int *a,int &sum)//先来先服务
{ sum=abs(head-a[0]);
for(int i=1;i<NUM;i++)
sum+=abs(a[i]-a[i-1]);
}
void SSTF(int head,int *a,int &sum)//最短寻道时间优先
{ int index,temp,min=999999;
int H=head;
for(int i=0;i<NUM-1;i++)
{
//找到最小距离的索引
for(int j=i;j<NUM;j++)
{
if(min>=abs(head-a[j]))
{
min=abs(head-a[j]);
index=j;
}
}
temp=a[i];
a[i]=a[index];
a[index]=temp;
head=a[i];
min=99999999;
}
sum=abs(H-a[0]);
for(int i=0;i<NUM-1;i++)
sum+=abs(a[i+1]-a[i]);
}
void SCAN(int head,int *a,int &sum)//电梯算法
{
stack<int> s;
sort(a,&a[NUM]);
for(int i=0;i<NUM-1;i++)
if(a[i]<=head)
s.push(a[i]);
for(int i=0;s.size()!=0;i++){
a[i]=s.top();
s.pop();
}
sum=abs(head-a[0]);
for(int i=1;i<NUM;i++)
sum+=abs(a[i]-a[i-1]);
}
int main()
{ int a[NUM]={98,183,37,122,14,124,65,67},head=53;
int sum=0;
//去掉注释自行输入
//Read(a,head);
//去掉注释从三个算法中选一个运行
//FCFS(head,a,sum);
//SSTF(head,a,sum);
SCAN(head,a,sum);
Write(a,sum,head);
system("pause");
}
运行示例:
先来先服务
最短寻道时间优先
电梯算法