磁盘调度算法设计
一. 实验目的
1 了解和掌握操作系统对磁盘如何调度管理。
2 熟悉并掌握各种磁盘调度的算法。
二. 实验设备
WindowsXP操作系统,VC6.0环境
三. 实验内容及操作步骤
1 实验内容
设计多个磁盘调度算法,分别是先来先服务算法,最短寻道时间优先算法,扫描算法。并且通过程序来计算寻道时间。 2 实验步骤
(1)
(2)
(3)
(4) 根据以下不同的算法思想编写调度程序,并装入VC 6.0中。 汇编并连接程序。 调试程序。 输入数据,验证不同磁盘调度算法的平均寻道时间,由此总
结各算法所使用的场合。
四. 算法思想
1 先来先服务
2 最短寻道时间优先
3 扫描子算法
4 扫描算法
五. 实验源程序
#include<iostream>
#include<vector>
#include <algorithm>
#define size 64//磁道序列个数最多为64个
using namespace std;
//==============================================================
void FCFS(int *sequ,int m)
{
cout<<"***先来现服务算法***"<<endl;
int j;
double sum,averay;
for(int i=0;i<m;++i)
cout<<*(sequ+i)<<" ";
for(i=0,j=1;j<m;++i,++j)
sum=abs(*(sequ+j)-*(sequ+i));
averay=sum/m;
cout<<endl<<"移动总道数:"<<sum<<"平均移动道数:"<<averay<<endl;
cout<<"***************************"<<endl;
}
//-------------------------------------------------------------
void FFTS(vector<int> sequ,int m)
{
cout<<"***最短寻道时间优先算法***"<<endl;
cout<<"请输入当前磁道号";
int now;
cin>>now;
int i=0;
double sum=0,averay;
while(sequ[i]<=now&&i<m)//找到当前磁道在磁道系列中的位置 ++i;
if(i==m)
{
for(i=m;i>=0;--i)
cout<<sequ[i]<<" ";
sum=sequ[m-1];
}
else if(i==0)
{
for(i=0;i<m;++i)
cout<<sequ[i]<<" ";
sum=sequ[m-1];
}
else
{
int tomp=now,l=i-1,h=i;
while(l>=0||h<m)
{
if(l>=0&&sequ[h]-tomp>sequ[l]-tomp) {
cout<<sequ[l]<<" ";
sum+=abs(sequ[l]-tomp);
tomp=sequ[l];
--l;
}
else if(h<m)
{
cout<<sequ[h]<<" ";
sum+=abs(sequ[h]-tomp); tomp=sequ[h];
++h;
}
}
}
averay=sum/m;
cout<<endl<<"移动总道数:"<<sum<<"平均移动道数:"<<averay<<endl;
cout<<"***************************"<<endl;
}
//-------------------------------------------------------------
void SACE(vector<int> sequ,int m)
{
cout<<"***电梯算法***"<<endl;
cout<<"请输入当前磁道号";
int now;
cin>>now;
int i=0;
double sum=0,averay;
while(sequ[i]<now&&i<m)//找到当前磁道在磁道系列中的位置 ++i;
cout<<"请选择寻道方向:L(左)、R(右)";
char chiose;
cin>>chiose;
int l=i-1,h=i;
if(chiose=='l'||chiose=='L') {
while(l>=0)
{
cout<<sequ[l]<<" "; sum+=sequ[l]; --l;
}
while(h<m)
{
cout<<sequ[h]<<" "; sum+=sequ[h]; ++h;
}
}
else
{
while(h<m)
{
cout<<sequ[h]<<" "; sum+=sequ[h]; ++h;
}
while(l>=0)
{
cout<<sequ[l]<<" ";
sum+=sequ[l];
--l;
}
}
averay=sum/m;
cout<<endl<<"移动总道数:"<<sum<<"平均移动道数:"<<averay<<endl;
cout<<"***************************"<<endl;
}
//-------------------------------------------------------------
void main()
{
int Buffer[size];
FILE *fp;
if((fp=fopen("磁道系列文件.txt","r"))==NULL)
{
cout<<"磁道系列文件.txt打开失败"<<endl;
exit(0);
}
int i;
for(i=0;i<size&&!feof(fp);++i)
fscanf(fp,"%d",&Buffer[i]);
Buffer[i]='\0';//将当前Buffer中的字符制空
cout<<"************磁盘调度算法************"<<endl; cout<<"从文件读入的磁道号系列为:";
for(int j=0;j<i;++j)
cout<<Buffer[j]<<" ";
cout<<endl;
vector<int> Sequ_vec(Buffer,Buffer+i);//将Buffer中的序列拷贝到Sequ_vec向量中
sort(Sequ_vec.begin(),Sequ_vec.end());//对Sequ_vec排序方便FFTS和SCAN算法的应用
while(1)
{
cout<<"1、先来先服务; 2、最短寻道时间优先; 3、电梯(SACE)算法; 4、退出"<<endl;
cout<<"请选择:";
int a;
cin>>a;
switch(a)
{
case 1:FCFS(Buffer,i);break;
case 2:FFTS(Sequ_vec,i);break;
case 3:SACE(Sequ_vec,i);break;
case 4:exit(0);
}
}
}
六. 实验测试及结果分析
和手算的结果一致。
七. 实验小结
(1) 通过输入不同的磁道号,可知先来先服务算法仅适用于请
求磁盘I/O的进程数目较少的场合,而SSTF算法的平均寻找时间明显低于先来先服务算法,因此它具有跟好的性能。
(2) 通过本次实验,深刻的理解了各个调度算法的特点,以及
其编程思想,从而掌握了如何提高磁盘I/O速度的途径。
第二篇:c++实验报告范文
实验(一) 预习报告(上实验课之前完成)
一、 实验目的:
1. 了解C语言开发环境的组成;
2. 学习C语言开发环境的使用方法;
3. 掌握C语言程序从编辑、编译、连接到运行并得到运行结果的过程。
二、 实验内容:
1. 从键盘输入两个整数,将其平方和输出(用函数求平方和)。
EX701_11.C程序清单:
#include<stdio.h>
int main( )
{
int a,b,c;
clrscr(); //清除屏幕上的所有信息
printf("\n Input a="); //数据输入前的提示信息
scanf("%d",&a);
printf("Input b=");
scanf("%d",&b);
c=SumSqr(a,b); //求a, b的平方和
printf("\nResult=%d", c);
return 0;
}
int SumSqr(x,y) //定义函数求a, b的平方和
int x,y;
{
return x*x+y*y;
}
2. 从键盘输入三个整数,将其最大值输出(用函数求最大值)。
EX701_12.C程序清单:
#include<stdio.h>
int main( )
{
int a,b,c,d;
printf("\n Input a=");
scanf("%d",&a);
printf("\n Input b=");
scanf("%d",&b);
printf("\n Input c=");
scanf("%d",&c);
d=max(a,b,c); //找a, b, c中的最大值
printf("\nMax=%d", d);
return 0;
}
int max(x,y,z) /定义函数/
int x,y,z;
{
int t;
t=x>y?x:y;
return z>t?z:t;
}
3. 输入三角形三边的长度,将其面积输出(用函数求面积)。
#include<math.h>
#include<stdio.h>
float area(x,y,z) //求三角形面积
float x,y,z;
{
float p,s;
p=(x+y+z)/2.0;
s=p*(p-x)*(p-y)*(p-z);
if(s>0)s=sqrt(s); //可以构成三角形
return s;
}
void main( )
{
float a,b,c,d;
printf("\nInput a=");
scanf("%f",&a);
printf("\nInput b=");
scanf("%f",&b);
printf("\nInput c=");
scanf("%f",&c);
d=area(a,b,c);
if(d<=0)printf("\Data error!"); //不能构成三角形
else printf("\nArea=%f", d);
}
实验(一) 实验报告(上实验课时完成)
三、 运行结果及分析:
1. EX701_11.C程序运行结果:
输入:Input a=1 <CR>
Input b=2 <CR>
输出:Result=5
分析:(基本操作步骤[仅用于实验一]):
(1) 双击桌面上的TC图标;
(2) 点窗口左上角,设置属性将窗口最大化;
(3) 新建文件:快捷键“Alt+F”,然后选“N”;
(4) 保存文件:按热键“F2”;
(5) 代码录入;
(6) 编译-连接-运行:按热键“Ctrl+F9”;
(7) 观看结果:按热键“Alt+F5”
(程序调试过程中出现以下错误):
(1) Size of ‘main’ is unknown or zero
main后掉了圆括号;
(2) Unterminated string or character constant
字符串少了双引号;
(3) Statement missing ;
语句后少了分号;
(4) Unable to open include ifle ‘STDIO.H’
不能打开stdio.h文件:要么文件不存在
要么Option菜单中的Directories设置有误;
(5) Undefined symbol ‘a’
没有定义变量a;
(6) Undefined symbol _main in dodule c0.asm
没有主函数main;
2. EX701_12.C程序运行结果:
输入:Input a=1 <CR>
Input b=2 <CR>
Input c=3 <CR>
输出:Max=3
分析:(程序调试过程中出现以下错误):
(1) 输出结果不正确:
max函数中的if~else结构不对;
(2) 输出结果总为0;
max中的return 语句有误
3. EX701_13.C程序运行结果:
输入:Input a=3 <CR>
Input b=4 <CR>
Input c=5 <CR>
输出:Area=6.000000
分析:(程序调试过程中出现以下错误):
(1) 边长若定义为int型,计算结果出错;
(2) float point error : Domain
没判断是否能组成一个三角形, sqrt中的参数为负(超出范围);
特别提示:
1. 每个实验包括实验目的、实验内容、实验结果及分析三大内容;
2. 实验内容中,必须抄题且按序(1、2、3、4)标明题号,
3. 实验结果及分析中,主要说明程序的运行结果,输入是什么(输入数据前的提示信息用下划线标出),输出是什么,同时记录下调试程序过程中出现的错误及解决方法。