磁盘调度算法实验报告 2Word文件下载.docx
《磁盘调度算法实验报告 2Word文件下载.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法实验报告 2Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
intdirection;
//寻道方向
intNum;
//访问的磁道号数目
intstart;
//
(2)输出的形式;
intMoveDistance[MaxNumber]={0};
//移动距离
doubleAverageDistance=0;
//平均寻道长度
移动的序列!
(3)程序所能达到的功能;
模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
开始磁道号:
100
磁道号方向:
内(0)和外
(1)
磁道号数目:
9
页面序列:
555839189016015038184
4、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
intTrackOrder[MaxNumber];
intMoveDistance[MaxNumber]={0};
//开始磁道号
5、详细设计
实现程序模块的具体算法。
6、调试分析
(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;
在SCAN_CSAN算法中在访问不同的数组时没有注意到上一个磁道号和要访问的磁道号的大小比较导致结果不对,后来在分析结果中找出原因。
(2)算法的性能分析(包括基本操作和其它算法的时间复杂度和空间复杂度的分析)及其改进设想;
FCFS:
时间复杂度为O
(1)空间复杂度为:
O
(1)
SSTF:
时间复杂度为O(n^2)空间复杂度为:
SCAN_CSAN:
7、用户使用说明
程序的使用说明,列出每一步的操作步骤。
(1)输入开始磁道号
(2)输入访问磁道号总数
(3)输入访问磁道号序列序列
(4)选择算法
(5)选择方向
(6)得出结果
8、测试结果
9、存在问题
在求移动距离时,若调用C++的库函数求绝对值会更方便!
10、心得体会
首先要明确磁盘调度的原理,画出算法流程图!
这样在解决问题时更容易!
11、附录
程序源代码:
#include<
iostream.h>
#defineMaxNumber100
voidFCFS(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],
doubleAverageDistance,intstart,intNum)
{
inti,temp=start,sum=0;
cout<
<
"
移动顺序移动距离"
endl;
for(i=0;
i<
Num;
i++)
{
if(TrackOrder[i]>
temp)
MoveDistance[i]=TrackOrder[i]-temp;
else
MoveDistance[i]=temp-TrackOrder[i];
sum+=MoveDistance[i];
temp=TrackOrder[i];
TrackOrder[i]<
"
MoveDistance[i]<
}
AverageDistance=sum*1.0/Num;
平均寻道长度:
AverageDistance<
}
voidSSTF(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],
inttemp=start,sum=0,s,count=0,min;
intkind[MaxNumber]={0};
while(count<
Num)
for(inti=0;
if(kind[i]==0)
{
if(TrackOrder[i]>
min=TrackOrder[i]-temp;
min=temp-TrackOrder[i];
s=i;
break;
}
inttemp1;
for(i=0;
i++)//找出里此时磁道距离最近的磁道号
temp1=TrackOrder[i]-temp;
temp1=temp-TrackOrder[i];
if(temp1<
min&
&
kind[i]==0)
{
min=temp1;
MoveDistance[count]=min;
sum+=MoveDistance[s];
temp=TrackOrder[s];
TrackOrder[s]<
MoveDistance[s]<
kind[s]=1;
count++;
voidpaixu(inta[MaxNumber],intn,intTrackOrder[MaxNumber])//从小到大排序
intsym=0;
while(sym==0)
intkind=0;
for(inti=0;
n-1;
ints1=a[i];
ints2=a[i+1];
if(TrackOrder[s1]>
TrackOrder[s2])
{
ints=a[i+1];
a[i+1]=a[i];
a[i]=s;
kind=1;
}
}
if(kind==0)
sym=1;
}
voidSCAN_CSAN(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],
doubleAverageDistance,intstart,intNum,intdirection,intchioce)
intsum=0;
inta[MaxNumber],b[MaxNumber];
inttemp=start;
inti,num1=0,num2=0;
i++)//分类
temp)
a[num1]=i;
num1++;
b[num2]=i;
num2++;
paixu(a,num1,TrackOrder);
//将数组按从小到达排序
paixu(b,num2,TrackOrder);
ints;
if(direction==0)//访问方向向外
for(i=0;
num1;
i++)//先访问num1并从前往后访问
s=a[i];
MoveDistance[s]=TrackOrder[s]-temp;
temp=TrackOrder[s];
cout<
if(chioce==3)//SCAN算法
for(i=num2-1;
i>
=0;
i--)//再访问num2并且从后往前访问
s=b[i];
MoveDistance[s]=temp-TrackOrder[s];
else//CSAN算法
s=b[0];
cout<
for(i=1;
num2;
i++)//再访问num2并且从前往后访问
else//访问方向向内
for(i=num2-1;
i--)//先访问num2并且从后往前访问
if(c