磁盘调度算法
需求分析
分别实现先到先服务调度(FCFS)磁盘调度算法、最短寻道时间优先算法(SSTF)、“电梯”调度算法(SCAN算法)、C-SCAN算法、LOOK调度算法和C-LOOK调度算法
概要设计
1.先到先服务调度(FCFS)磁盘调度算法
按照磁道的访问顺序依次访问每个磁道。
2.最短寻道时间优先算法(SSTF)
从指定磁道,依次访问距离本磁道最近的磁道。
3.“电梯”调度算法(SCAN算法)
从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问到最终磁道后,转向访问初始磁道另一侧的每个磁道,规则和以上相同。
4.C-SCAN算法
从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问到磁盘最大(最小)容量后,转向访问初始磁道另一侧的每个磁道,到磁盘容量最小(最大),规则和以上相同。
5.LOOK调度算法
从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问完最终磁道后,转向访问据本磁道最远的磁道,按如上规则依次访问至初始磁道。
6.C-LOOK调度算法
从指定磁道,向指定方向单向移动,依次访问距离本磁道最近的磁道,访问至磁盘最大(最小)容量后,转向访问磁盘的最小(最大)容量磁道,按如上规则依次访问至初始磁道。
代码实现
1.先到先服务调度(FCFS)
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=1010;
void run(int track[],int index,int n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=abs(index-track[i]);
index=track[i];
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1;i<=n;i++)
cout<<track[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int track[],int n)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1;i<=n;i++)
cin>>track[i];
}
void FCFS_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
int track[maxn];
input(track,n);
run(track,index,n);
}
int main()
{
FCFS_PRO();
return 0;
}
2.最短寻道时间优先算法(SSTF)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
int sum=0;
int order[maxn];
int cur=1;
while(!l.empty()&&!r.empty())
{
if(abs(l.top()-index)<=abs(r.top()-index))
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
order[cur++]=index;
}
else
{
sum+=abs(r.top()-index);
index=l.top();
l.pop();
order[cur++]=index;
}
}
while(!l.empty())
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
order[cur++]=index;
}
while(!r.empty())
{
sum+=abs(r.top()-index);
index=r.top();
r.pop();
order[cur++]=index;
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1;i<=n;i++)
cout<<order[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1;i<=n;i++)
{
cin>>track[i];
if(track[i]>=index)
r.push(track[i]);
else
l.push(track[i]);
}
}
void SSTF_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
input(index,n);
run(index,n);
}
int main()
{
SSTF_PRO();
return 0;
}
3.“电梯”调度算法(SCAN算法)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
int maxindex=0;
int minindex=0;
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n,int capacity)
{
int sum=0;
int order[maxn];
int cur=1;
while(!r.empty())
{
sum+=abs(r.top()-index);
index=r.top();
r.pop();
if(index!=capacity||(index==capacity&&maxindex==1))
{order[cur++]=index;
}
}
while(!l.empty())
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
if(index!=0||(index==0&&minindex==1))
order[cur++]=index;
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1; i<=n; i++)
cout<<order[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n,int capacity)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1; i<=n; i++)
{
cin>>track[i];
if(track[i]>=index)
{
if(track[i]==capacity)
maxindex=1;
r.push(track[i]);
}
else
{
if(track[i]==0)
minindex=1;
l.push(track[i]);
}
}
if(!maxindex)
r.push(capacity);
if(!minindex)
l.push(0);
}
void SCAN_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入磁盘容量"<<endl;
int capacity;
cin>>capacity;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
input(index,n,capacity);
run(index,n,capacity);
}
int main()
{
SCAN_PRO();
return 0;
}
4.C-SCAN算法
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
int maxindex=0;
int minindex=0;
priority_queue<int, vector<int>, greater<int>>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n,int capacity)
{
int sum=0;
int order[maxn];
int cur=1;
while(!r.empty())
{
sum+=abs(r.top()-index);
index=r.top();
r.pop();
if(index!=capacity||(index==capacity&&maxindex==1))
{order[cur++]=index;
}
}
while(!l.empty())
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
if(index!=0||(index==0&&minindex==1))
order[cur++]=index;
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1; i<=n; i++)
cout<<order[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n,int capacity)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1; i<=n; i++)
{
cin>>track[i];
if(track[i]>=index)
{
if(track[i]==capacity)
maxindex=1;
r.push(track[i]);
}
else
{
if(track[i]==0)
minindex=1;
l.push(track[i]);
}
}
if(!maxindex)
r.push(capacity);
if(!minindex)
l.push(0);
}
void SCAN_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入磁盘容量"<<endl;
int capacity;
cin>>capacity;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
input(index,n,capacity);
run(index,n,capacity);
}
int main()
{
SCAN_PRO();
return 0;
}
5.LOOK调度算法
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
int sum=0;
int order[maxn];
int cur=1;
while(!r.empty())
{
sum+=abs(r.top()-index);
index=r.top();
r.pop();
order[cur++]=index;
}
while(!l.empty())
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
order[cur++]=index;
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1;i<=n;i++)
cout<<order[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1;i<=n;i++)
{
cin>>track[i];
if(track[i]>=index)
r.push(track[i]);
else
l.push(track[i]);
}
}
void LOOK_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
input(index,n);
run(index,n);
}
int main()
{
LOOK_PRO();
return 0;
}
6.C-LOOK调度算法
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int track[maxn];
priority_queue<int, vector<int>, greater<int>>l;
priority_queue<int, vector<int>, greater<int>>r;
void run(int index,int n)
{
int sum=0;
int order[maxn];
int cur=1;
while(!r.empty())
{
sum+=abs(r.top()-index);
index=r.top();
r.pop();
order[cur++]=index;
}
while(!l.empty())
{
sum+=abs(l.top()-index);
index=l.top();
l.pop();
order[cur++]=index;
}
cout<<"访问磁道顺序为"<<endl;
for(int i=1;i<=n;i++)
cout<<order[i]<<" ";
cout<<endl;
cout<<"寻道总距离为:"<<sum<<endl;
cout<<"平均寻道距离为:"<<sum*1.0/n<<endl;
}
void input(int index,int n)
{
cout<<"请依次输入需要访问的磁道号"<<endl;
for(int i=1;i<=n;i++)
{
cin>>track[i];
if(track[i]>=index)
r.push(track[i]);
else
l.push(track[i]);
}
}
void CLOOK_PRO()
{
cout<<"请输入当前磁道号"<<endl;
int index;
cin>>index;
cout<<"请输入需要访问的磁道数目"<<endl;
int n;
cin>>n;
input(index,n);
run(index,n);
}
int main()
{
CLOOK_PRO();
return 0;
}
55 58 39 18 90 160 150 38 184
运行实例
1.先到先服务调度(FCFS)磁盘调度算法
2.最短寻道时间优先算法(SSTF)
3.“电梯”调度算法(SCAN算法)
4.SCAN算法
5.LOOK调度算法
6.CLOOK调度算法
还没有评论,来说两句吧...