磁盘调度管理
一、设计目的:
加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。
二、设计内容:
通过编程实现不同磁盘调度算法。
设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。
常用的磁盘调度算法简介如下,请在最短寻道优先算法SSTF、扫描算法SCAN、循环扫描算法CSCAN中任意选择两种实现,并对算法性能进行分析对比。
三、开发环境
windows环境,VC6.0平台。
四、分析设计
<一>实验原理:
- 最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
- 扫描算法SCAN:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。
<二>程序结构:
输入磁道个数,选择寻道算法
0:退出
1:SSTF最短寻道优先算法
2:SCAN扫描算法
附录、源程序清单
#include<iostream>
#include<ctime>
using namespace std;
void SSTF(int a[],int n);
void SCAN(int a[],int n);
int main()
{
int n; //磁道个数
int s; //功能号
cout<<"请输入当前磁道个数,按Enter显示生成的随机磁道号:"<<endl;
cin>>n;
int *a=new int[n];
cout<<"生成磁道号为";
srand((unsigned)time(NULL)); //给srand提供一个种子,它是unsigned int类型,取值范围0-65565
for(int i=0;i<n;i++){
a[i]=(rand()%200)+1; //rand根据srand种子值返回一个随机数
cout<<a[i]<<" ";
}
cout<<endl;
while(1){
cout<<"请选择算法"<<endl;
cout<<"0:退出 1:SSTF 2:SCAN"<<endl;
cin>>s;
if(s>4){
cout<<"输入有误,请重新输入"<<endl;
}
else{
switch(s){
case 0:exit(0);
case 1:SSTF(a,n);break;
case 2:SCAN(a,n);break;
}
}
}
return 0;
}
//最短寻道时间算法(SSTF)
void SSTF(int a[],int n) {
int temp;
int k=1;
int now,l,r;
int i,j,sum=0; //将磁道号按递增排序,冒泡排序
for(i=0;i<n;i++)
for(j=i+1;j<n;j++) {
if(a[i]>a[j]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout<<"按递增顺序排好的磁道显示为:"<<endl;
for( i=0;i<n;i++) {
cout<<a[i]<<" "; //输出排好的磁道顺序
}
cout<<endl;
now=rand()%200;
cout<<"当前磁道为"<<now<<endl;
cout<<"磁盘调度顺序为:"<<endl;
if(a[n-1]<=now){ //当前磁头位置大于最外围欲访问磁道
for(i=n-1;i>=0;i--)
cout<<a[i]<<" ";
sum=now-a[0];
}
else if(a[0]>=now){ //当前磁头位置小于最里欲访问磁道
for(i=0;i<n;i++)
cout<<a[i]<<" ";
sum=a[n-1]-now;
}
else {
while(a[k]<now){ //当前磁道在已排的序列中的位置
k++;
}
l=k-1; //在磁头位置的前一个欲访问磁道
r=k; //磁头欲访问磁道
while((l>=0)&&(r<n)) {
if((now-a[l])<=(a[r]-now)){//选择离磁头近的磁道
cout<<a[l]<<" ";
sum+=now-a[l];
now=a[l];
l=l-1;
}
else {
cout<<a[r]<<" ";
sum+=a[r]-now;
now=a[r];
r=r+1;
}
}
if(l==-1){//磁头位置里侧的磁道已访问完
for(j=r;j<n;j++){//访问磁头位置外侧的磁道
cout<<a[j]<<" ";
}
sum+=a[n-1]-a[0];
}
if(r==n){//磁头位置外侧的磁道已访问完
for(j=k-1;j>-1;j--){ //访问磁头位置里侧的磁道
cout<<a[j]<<" ";
}
sum+=a[n-1]-a[0];
}
}
cout<<endl;
cout<<"移动的总道数为:"<<sum<<endl;