參考博客:http://blog.csdn.net/jaster_wisdom/article/details/52468743
常用磁盤調度算法:FCFS、SSTF、SCAN、CSCAN(共四種)
/* FCFS(先來先服務)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
int pos = 0;
int dis = 0;
double ave_dis = 0;
void request(vector<int> &vec)
{
cout<<"隨機生成磁盤序列: "<<endl;
int n = 0;
srand(time(NULL));
n = rand() % 20 + 1;
int temp = 0;
for(int i = 0; i < n; i++)
{
temp = rand() % 100;
vec.push_back(temp);
cout<<temp<<" ";
}
cout<<endl;
pos = rand() % 100;
cout<<"當前磁道: "<<pos<<endl;
}
void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
ave_dis = (double)dis / (double)vec.size();
}
void print()
{
cout<<endl;
cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}
// 先來先服務算法
void FCFS(vector<int>vec,int pos)
{
dis = 0;
ave_dis = 0;
cout<<pos;
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
dis += abs(pos - *it);
cout<<"->"<<*it;
pos = *it;
}
compute_dis(vec,dis,ave_dis);
}
int main()
{
while(1)
{
vector<int> vec;
while(!vec.empty())
vec.pop_back();
request(vec);
FCFS(vec,pos);
print();
break;
}
return 0;
}
/* SSTF(最短尋道時間優先)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
int pos = 0;
int dis = 0;
double ave_dis = 0;
void request(vector<int> &vec)
{
cout<<"隨機生成磁盤序列: "<<endl;
int n = 0;
srand(time(NULL));
n = rand() % 20 + 1;
int temp = 0;
for(int i = 0; i < n; i++)
{
temp = rand() % 100;
vec.push_back(temp);
cout<<temp<<" ";
}
cout<<endl;
pos = rand() % 100;
cout<<"當前磁道: "<<pos<<endl;
}
void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
ave_dis = (double)dis / (double)vec.size();
}
void print()
{
cout<<endl;
cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}
// 最短尋道時間算法
void SSTF(vector<int>vec,int pos)
{
dis = 0;
ave_dis = 0;
sort(vec.begin(),vec.end());
int i = 0;
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
if(pos >= *it)
i++;
}
int count = 0;
int left = i-1;
int right = i;
while(count < vec.size())
{
if((left >= 0 && abs(vec[right]-pos) > abs(vec[left]-pos)) ||
right >= vec.size())
{
dis += abs(vec[left] - pos);
cout<<"->"<<vec[left];
pos = vec[left];
left--;
}
else
{
dis += abs(vec[right] - pos);
cout<<"->"<<vec[right];
pos = vec[right];
right++;
}
count++;
}
compute_dis(vec,dis,ave_dis);
}
int main()
{
while(1)
{
vector<int> vec;
while(!vec.empty())
vec.pop_back();
request(vec);
cout<<pos;
SSTF(vec,pos);
print();
break;
}
return 0;
}
/* SCAN(掃描算法,雙向)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
int pos = 0;
int dis = 0;
double ave_dis = 0;
void request(vector<int> &vec)
{
cout<<"隨機生成磁盤序列: "<<endl;
int n = 0;
srand(time(NULL));
n = rand() % 20 + 1;
int temp = 0;
for(int i = 0; i < n; i++)
{
temp = rand() % 100;
vec.push_back(temp);
cout<<temp<<" ";
}
cout<<endl;
pos = rand() % 100;
cout<<"當前磁道: "<<pos<<endl;
}
void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
ave_dis = (double)dis / (double)vec.size();
}
void print()
{
cout<<endl;
cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}
// 掃描算法
void SCAN(vector<int>vec,int pos)
{
dis = 0;
ave_dis = 0;
sort(vec.begin(),vec.end());
int i = 0;
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
if(pos >= *it)
i++;
}
int left = i-1;
int right = i;
while(left >= 0)
{
dis += abs(pos - vec[left]);
cout<<"->"<<vec[left];
pos = vec[left];
left--;
}
while(right < vec.size())
{
dis += abs(pos - vec[right]);
cout<<"->"<<vec[right];
pos = vec[right];
right++;
}
compute_dis(vec,dis,ave_dis);
}
int main()
{
while(1)
{
vector<int> vec;
while(!vec.empty())
vec.pop_back();
request(vec);
cout<<pos;
SCAN(vec,pos);
print();
break;
}
return 0;
}
/* CSCAN(循環掃描算法,單向)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
int pos = 0;
int dis = 0;
double ave_dis = 0;
void request(vector<int> &vec)
{
cout<<"隨機生成磁盤序列: "<<endl;
int n = 0;
srand(time(NULL));
n = rand() % 20 + 1;
int temp = 0;
for(int i = 0; i < n; i++)
{
temp = rand() % 100;
vec.push_back(temp);
cout<<temp<<" ";
}
cout<<endl;
pos = rand() % 100;
cout<<"當前磁道: "<<pos<<endl;
}
void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
ave_dis = (double)dis / (double)vec.size();
}
void print()
{
cout<<endl;
cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}
// 循環掃描算法
void CSCAN(vector<int>vec,int pos)
{
dis = 0;
ave_dis = 0;
sort(vec.begin(),vec.end());
int i = 0;
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
if(pos >= *it)
i++;
}
int left = i-1;
int right = i;
while(left >= 0)
{
dis += abs(pos - vec[left]);
cout<<"->"<<vec[left];
pos = vec[left];
left--;
}
pos = 100;
int len = vec.size()-1;
while(len >= right)
{
dis += abs(pos - vec[len]);
cout<<"->"<<vec[len];
pos = vec[len];
len--;
}
compute_dis(vec,dis,ave_dis);
}
int main()
{
while(1)
{
vector<int> vec;
while(!vec.empty())
vec.pop_back();
request(vec);
cout<<pos;
CSCAN(vec,pos);
print();
break;
}
return 0;
}
磁盤調度算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.