磁盘调度算法

#include
#include
#include<math.h>
using namespace std;

const int MaxNumber=100;
typedef struct Track_struct{
int Number;
int TrackOrder[MaxNumber]; //存储磁道序列
int MoveDistance[MaxNumber]; //移动距离
int FindOrder[MaxNumber]; //寻道序列
int SortOrder[MaxNumber]; //排序后的序列
bool Finished[MaxNumber]; //结束标志
}Track;

Track T; //定义变量
int M; //磁道数
int N; //提出磁盘I/O申请的进程数
void Pinput(); //参数输入
void Poutput(); //参数输出
void FCFS(); //先来先服务FCFS算法
double AverageDistance; //平均寻道长度
bool direction; //方向 true时为向外,false为向里
int BeginNum; //开始磁道号

void Pinput() //参数输入
{
cout<<“磁盘调度算法\n”;
cout<<“请输入磁道数:”;
cin>>M;
cout<<“请输入提出磁盘I/O申请的进程数:”;
cin>>N;
cout<<“请依次输入要访问的磁道号:”;
for(int i=0;i<N;i++)
cin>>T.TrackOrder[i];
for(int j=0;j<N;j++)
T.MoveDistance[j]=0;
cout<<“请输入开始磁道号:”;
cin>>BeginNum;
for(int k=0;k<N;k++)
{
T.Finished[k]=false;
T.SortOrder[k]=T.TrackOrder[k];
}
}

void Sort() //排序函数,将各进程申请的磁道按从小到大排序
{ //冒泡排序
int temp;
for(int i=N-1;i>=0;i–)
for(int j=0;j<i;j++)
{
if(T.SortOrder[j]>T.SortOrder[j+1])
{
temp=T.SortOrder[j];
T.SortOrder[j]=T.SortOrder[j+1];
T.SortOrder[j+1]=temp;
}
}
}

void Poutput() //结果输出
{
int Total=0; //计算平均寻道时间
for(int i=0;i<N;i++)
{
Total+=T.MoveDistance[i];
}
AverageDistance=((double)Total)/((double)N);
cout<<“从"<<BeginNum<<"号磁道开始=====”<<endl;
cout<<setw(20)<<“被访问的下一个磁道号”<<setw(20)<<“移动距离(磁道数)”<<endl;
for(int i=0;i<N;i++)
{
cout<<setw(15)<<T.FindOrder[i]<<setw(15)<<T.MoveDistance[i]<<endl;
}
cout<<setw(20)<<“平均寻道长度:”<<AverageDistance<<endl;
cout<<endl;
}

void FCFS() //FCFS,先来先服务
{
int temp;
temp=BeginNum; //将BeginNum赋给temp作为寻道时的当前所在磁道号
for(int i=0;i<N;i++)
{
T.MoveDistance[i]=abs(T.TrackOrder[i]-temp); //-------计算移动磁道数
temp=T.TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给temp
T.FindOrder[i]=T.TrackOrder[i]; //-----寻好的赋给寻好序列
}
}

#include
using namespace std;
void SSTF(); //最短寻道时间(SSTF)算法

void SSTF() //SSTF,最短寻道法
{
int temp,n;
int A=M;
temp=BeginNum; //将BeginNum赋给temp作为寻道时的当前所在磁道号
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++) //寻找最短的寻道长度
{
if(abs(T.TrackOrder[j]-temp)<A&&T.Finished[j]==false)
{
A=abs(T.TrackOrder[j]-temp);
n=j;
}
else continue;
}
T.Finished[n]=true; //将已经寻找到的Finished赋值为true
T.MoveDistance[i]=A; //寻道长度
temp=T.TrackOrder[n]; //当前寻道号
A=M; //重置A值
T.FindOrder[i]=T.TrackOrder[n]; //寻好的赋给寻好序列
}
}

#include
using namespace std;
void SCAN(); //扫描算法(SCAN)

void SCAN() //SCAN,扫描算法
{
int m,n,temp;
temp=BeginNum;
Sort(); //排序
cout<<“请选择开始方向:1–向外;0—向里”; //选择扫描方向
cin>>m;
if(m1)
direction=true;
else if(m
0)
direction=false;
else
cout<<“输入错误”;
for(int i=0;i<N;i++)
{
if(T.SortOrder[i]<BeginNum)
continue;
else
{
n=i;
break;
}

}
if(direction==true)       //选择向外
{
	for(int i=n;i<N;i++)
	{
			T.MoveDistance[i-n]=abs(T.SortOrder[i]-temp);
			temp=T.SortOrder[i];
			T.FindOrder[i-n]=T.SortOrder[i];
	}
	for(int j=n-1;j>=0;j--)
	{
			T.MoveDistance[N-1-j]=abs(T.SortOrder[j]-temp);
			temp=T.SortOrder[j];
			T.FindOrder[N-1-j]=T.SortOrder[j];
	}
}
else         //选择向里
{
	for(int i=n-1;i>=0;i--)
	{
		T.MoveDistance[N-i-4]=abs(T.SortOrder[i]-temp);
		temp=T.SortOrder[i];
		T.FindOrder[N-i-4]=T.SortOrder[i];

	}
	for(int j=n;j<N;j++)
	{
			T.MoveDistance[j]=abs(T.SortOrder[j]-temp);
			temp=T.TrackOrder[j];
			T.FindOrder[j]=T.SortOrder[j];
	}

}

}

#include
using namespace std;
void CSCAN(); //循环扫描算法(CSCAN)

void CSCAN() //CSCAN,循环扫描算法
{
int m,n,temp;
temp=BeginNum;
Sort();
cout<<“请选择开始方向:1–向外;0—向里”;
cin>>m;
if(m1)
direction=true;
else if(m
0)
direction=false;
else
cout<<“输入错误”;
for(int i=0;i<N;i++)
{
if(T.SortOrder[i]<BeginNum)
continue;
else
{
n=i;
break;
}
}
if(direction==true)
{
for(int i=n;i<N;i++)
{
T.MoveDistance[i-n]=abs(T.SortOrder[i]-temp);
temp=T.SortOrder[i];
T.FindOrder[i-n]=T.SortOrder[i];
}
for(int j=0;j<n;j++)
{
T.MoveDistance[N-n+j]=abs(T.SortOrder[j]-temp);
temp=T.SortOrder[j];
T.FindOrder[N-n+j]=T.SortOrder[j];
}
}
else
{
for(int i=n-1;i>=0;i–)
{
T.MoveDistance[n-1-i]=abs(T.SortOrder[i]-temp);
temp=T.SortOrder[i];
T.FindOrder[n-1-i]=T.SortOrder[i];
}
for(int j=N-1;j>=n;j–)
{
T.MoveDistance[N-j+n-1]=abs(T.SortOrder[j]-temp);
temp=T.SortOrder[j];
T.FindOrder[N-j+n-1]=T.SortOrder[j];
}

}

}

#include
#include
//#include<math.h>
//#include “FCFS.h”
//#include “SSTF.h”
//#include “SCAN.h”
//#include “CSCAN.h”
using namespace std;

void Sort(); //排序函数

int main() //主函数
{
int y=1;
int s;
Pinput();
while(y==1)
{
cout<<“请选择寻道方式:1–FCFS; 2–SSTF; 3–SCAN;4–CSCSN;”;
cin>>s;
switch(s)
{
case 1:
FCFS();
Poutput();
break;
case 2:
SSTF();
Poutput();
break;
case 3:
SCAN();
Poutput();
break;
case 4:
CSCAN();
Poutput();
break;
}
cout<<“是否继续选择寻道算法?1–是;2–否”;
int p;
cin>>p;
y=p;
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值