1.算法解析
最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。比如现有需要读取的数据的柱面次序为:35 12 73 230 80 20 310 120,初始柱面为65号,当65操作结束后,应该先处理73号柱面的请求,然后到达80号柱面执行操作,随后处理120号柱面请求,后继操作的次序应该是35、20、12、230、310。
采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了400多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。
2.代码
①最短寻道时间优先算法函数SSTF()
int SSTF(int *cyclist, int *cycorder, int n, int start){
//参数:cyclist[] 输入的待操作的柱面数组,cycorder[] 操作柱面的顺序结果
// n 柱面的个数,start 初始的柱面号
//返回值:sum SSTF的走道总和
int sum, min, mid, index, tag[100] = {0};
sum = 0;
for(int j=0; j<n; j++){ //此循环得出cycorder[]和累加sum
min = 9999; //将最小值初始化为无穷大
for(int i=0; i<n; i++) //次循环得出距离start最小值min
if(tag[i] == 0){
mid = abs(start - cyclist[i]);
if(min > mid){
min = mid;
index = i; //记录下与start最近柱面的下标
}
}
sum += min;
tag[index] = 1; //将标记数组置为1,表示已经将其柱面进行操作
cycorder[j] = cyclist[index];
start = cyclist[index];
}
return sum;
}
②全部代码
#include<iostream>
#include<cmath>
using namespace std;
int SSTF(int *cyclist, int *cycorder, int n, int start){
int sum, min, mid, index, tag[100] = {0};
sum = 0;
for(int j=0; j<n; j++){
min = 9999;
for(int i=0; i<n; i++)
if(tag[i] == 0){
mid = abs(start - cyclist[i]);
if(min > mid){
min = mid;
index = i;
}
}
sum += min;
tag[index] = 1;
cycorder[j] = cyclist[index];
start = cyclist[index];
}
return sum;
}
int main(){
int cyclist[100], cycorder[100], n, start;
cout<<"请输入初始柱面和待执行柱面数量:";
cin>>start>>n;
cout<<"请输入待执行柱面:";
for(int i=0; i<n; i++)
cin>>cyclist[i];
cout<<"磁头走过总道数为:"<<SSTF(cyclist, cycorder, n, start)<<endl;
cout<<"SSTF走道顺序为:";
for(int i=0; i<n; i++){
cout<<cycorder[i];
if(i+1 != n)
cout<<" -> ";
}
return 0;
}
/*
65 8
35 12 73 230 80 20 310 120
*/
3.运行结果