操作系统 -磁盘调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

磁盘调度算法
一、实验目的
1、对磁盘调度的相关知识作进一步的了解,明确磁盘调度的原理。

2、加深理解磁盘调度的主要任务。

3、通过编程,掌握磁盘调度的主要算法。

二、实验内容和要求
1、对于如下给定的一组磁盘访问进行调度:
3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。

4、假定当前读写头在90号,向磁道号增加的方向移动。

三、实验报告
1、程序中使用的数据结构及符号说明。

2、给出主要算法的流程图。

3、给出程序清单并附上注释。

4、给出测试数据和运行结果。

#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
const int MaxNumber=100;
int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber]; //----移动距离;
int FindOrder[MaxNumber]; //-----寻好序列。

double AverageDistance; //-----平均寻道长度
bool direction; //-----方向 true时为向外,false为向里
int BeginNum; //----开始磁道号。

int M; //----磁道数。

int N; //-----提出磁盘I/O申请的进程数
int SortOrder[MaxNumber]; //----排序后的序列
bool Finished[MaxNumber];
void Inith()
{
cout<<"请输入磁道数(最大磁盘数目):";
cin>>M;
cout<<"请输入提出磁盘I/O申请的进程数:";
cin>>N;
cout<<"请依次输入要访问的磁道号:";
for(int i=0;i<N;i++)
cin>>TrackOrder[i];
for(int j=0;j<N;j++)
MoveDistance[j]=0;
cout<<"请输入开始磁道号:";
cin>>BeginNum;
for(int k=0;k<N;k++)
Finished[k]=false;
for(int l=0;l<N;l++)
SortOrder[l]=TrackOrder[l];
}
//=====================排序函数,将各进程申请的磁道按从小到大排列=================
void Sort()
{ //------冒泡排序
int temp;
for(int i=N-1;i>=0;i--)
for(int j=0;j<i;j++)
{
if(SortOrder[j]>SortOrder[j+1])
{
temp=SortOrder[j];
SortOrder[j]=SortOrder[j+1];
SortOrder[j+1]=temp;
}
}
}
//============先来先服务=================================
void FCFS()
{
int temp;
temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++)
{
MoveDistance[i]=abs(TrackOrder[i]-temp); //-------计算移动磁道数
temp=TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给temp
FindOrder[i]=TrackOrder[i]; //-----寻好的赋给寻好序列}
}
//========最短寻道法=============================
void 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(TrackOrder[j]-temp)<A&&Finished[j]==false)
{
A=abs(TrackOrder[j]-temp);
n=j;
}
else continue;
}
Finished[n]=true; //-------将已经寻找到的Finished赋值为true
MoveDistance[i]=A; //-------寻道长度
temp=TrackOrder[n]; //-------当前寻道号。

A=M; //-----重置A值
FindOrder[i]=TrackOrder[n]; //----寻好的赋给寻好序列
}
}
//=====================S扫描算法(电梯调度算法)==========================
void SCAN()
{
int m,n,temp;
temp=BeginNum;
Sort(); //------排序
cout<<"请选择开始方向:.向外扫描;0.向里扫描"; //------选择扫描方向
cin>>m;
if(m==1)
direction=true;
else if(m==0)
direction=false;
else
cout<<"输入错误!";
for(int i=0;i<N;i++)
{
if(SortOrder[i]<BeginNum)
continue;
else
{
n=i;
break;
}
}
if(direction==true) //------选择向外
{
for(int i=n;i<N;i++)
{
MoveDistance[i-n]=abs(SortOrder[i]-temp);
temp=SortOrder[i];
FindOrder[i-n]=SortOrder[i];
}
for(int j=n-1;j>=0;j--)
{
MoveDistance[N-1-j]=abs(SortOrder[j]-temp);
temp=SortOrder[j];
FindOrder[N-1-j]=SortOrder[j];
}
}
else//-------选择向里
{
for(int i=n-1;i>=0;i--)
{
MoveDistance[N-i-4]=abs(SortOrder[i]-temp);
temp=SortOrder[i];
FindOrder[N-i-4]=SortOrder[i];
}
for(int j=n;j<N;j++)
{
MoveDistance[j]=abs(SortOrder[j]-temp);
temp=TrackOrder[j];
FindOrder[j]=SortOrder[j];
}
}
}
void Count()
{
int Total=0;
for(int i=0;i<N;i++)
{
Total+=MoveDistance[i];
}
AverageDistance=((double)Total)/((double)N);
}
void Show()
{
cout<<"================从"<<BeginNum<<"号磁道开始====================="<<endl;
cout<<setw(20)<<"被访问的下一个磁道号"<<setw(20)<<"移动距离(磁道数)"<<endl;
for(int i=0;i<N;i++)
{
cout<<setw(15)<<FindOrder[i]<<setw(15)<<MoveDistance[i]<<endl;
}
cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;
cout<<endl;
}
int main()
{
int y=1;
int s;
Inith();
while(y)
{
cout<<"请选择寻道方式:.先来先服务算法; 2.最短寻道优先算法; 3.电梯调度算法(扫描算法)";
cin>>s;
switch(s)
{
case 1:FCFS();Count();Show();break;
case 2:SSTF();Count();Show();break;
case 3:SCAN();Count();Show();break;
}
cout<<"是否继续选择寻道算法?.是;.否";
int p;
cin>>p;
y=p;
}
return 0;
}
先来先服务
最短寻道优先算法
电梯调度算法(1)向外扫描
(2)向里扫描。

相关文档
最新文档