实验四 磁盘调度算法模拟
实验目的
掌握先来先服务、最短寻道时间优先、电梯调度等几种磁盘调度方法中磁盘调度次序、移动的磁道数的计算方法,并熟悉程序设计中数组、结构体、循环等在解决实际问题中的应用方法。
- 给定磁盘访问请求序列,模拟实现先来先服务、寻道时间最短优先、扫描、循环扫描等磁盘调度算法;
- 输出每种磁盘调度算法下的磁盘访问的移动顺序、每次磁头的移动距离、平均寻道长度;
- 编制一个菜单,可以选择调用不同的磁盘调度算法。
代码实现
题目同样描述的很模糊,这里就按自己想法实现了。
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
void FCFS(vector<int>reqs, int n){
cout<<"磁盘移动顺序: ";
for (int i = 0; i < n; ++i){
cout<<reqs[i]<<" ";
}
int sum=0;
cout<<"\n每次磁盘移动距离(假设初始在100位置): ";
cout<<abs(reqs[0]-100)<<" ";
sum+=abs(reqs[0]-100);
for (int i = 1; i < n; ++i) {
cout<<abs(reqs[i]-reqs[i-1])<<" ";
sum+=abs(reqs[i]-reqs[i-1]);
}
cout<<"\n平均寻道长度: "<<(sum*1.0)/(n*1.0)<<endl;
cout<<"====================================\n";
}
void SSFT(vector<int>reqs, int n){
int size = n;
int sum = 0;
int curIndexVal = 100;
cout<<"磁盘移动顺序及对应磁盘移动距离, 每对数据以逗号隔开, 假设初始位于100位置:\n";
while(n){
int minDiff=INT_MAX;
int curIndex = 0;
for(int i=0;i<reqs.size();i++){
if(abs(reqs[i]-curIndexVal)<=minDiff) {
curIndex=i;
minDiff=abs(reqs[i]-curIndexVal);
}
}
cout<<reqs[curIndex]<<","<<minDiff<<" ";
sum += minDiff;
curIndexVal=reqs[curIndex];
reqs.erase(reqs.begin() + curIndex);
n--;
}
cout<<"\n平均寻道长度: "<<(sum*1.0)/(size*1.0)<<endl;
cout<<"====================================\n";
}
void SCAN(vector<int>reqs, int n){
int sum = 0;
int curIndexVal = 100;
int size = n;
sort(reqs.begin(), reqs.end());
cout<<"磁盘移动顺序及对应磁盘移动距离, 每对数据以逗号隔开, 假设初始位于100位置:\n";
int i=0;
while(reqs[i]<100){
i++; //磁头移动到100位置
}
while(n) {
for(;i<reqs.size();i++) {
cout<<reqs[i]<<","<<reqs[i]-curIndexVal<<"\t";
sum+=reqs[i]-curIndexVal;
curIndexVal=reqs[i];
n--;
reqs.erase(reqs.begin() + i);
}
i = (int) reqs.size()-1;
for(;i>=0;i--) {
cout<<reqs[i]<<","<<curIndexVal-reqs[i]<<"\t";
sum+=curIndexVal-reqs[i];
curIndexVal=reqs[i];
n--;
reqs.erase(reqs.begin() + i);
}
}
cout<<"\n平均寻道长度: "<<(sum*1.0)/(size*1.0)<<endl;
cout<<"====================================\n";
}
void CSCAN(vector<int>reqs, int n){
int sum = 0;
int curIndexVal = 100;
int size = n;
sort(reqs.begin(), reqs.end());
cout<<"磁盘移动顺序及对应磁盘移动距离, 每对数据以逗号隔开, 假设初始位于100位置:\n";
int i=0;
while(reqs[i]<100){
i++; //磁头移动到100位置
}
while(n) {
for(;i<reqs.size();i++) {
cout<<reqs[i]<<","<<abs(reqs[i]-curIndexVal)<<"\t";
sum+=abs(reqs[i]-curIndexVal);
curIndexVal=reqs[i];
n--;
reqs.erase(reqs.begin() + i);
}
i = 0;
}
cout<<"\n平均寻道长度: "<<(sum*1.0)/(size*1.0)<<endl;
cout<<"====================================\n";
}
int main() {
vector<int> request = {55,58,39,18,90,160,150,38,184};
int n = (int) request.size();
while(true) {
int opt;
cout<<"输入寻道算法, 1 FCFS, 2 SSFT, 3 SCAN, 4 CSCAN : ";
cin>>opt;
cout<<"======================================\n";
switch (opt) {
case 1:
FCFS(request, n);
break;
case 2:
SSFT(request, n);
break;
case 3:
SCAN(request, n);
break;
case 4:
CSCAN(request, n);
break;
default:
return 0;
}
}
}