操作系统实验四磁盘调度算法实验报告.docx
《操作系统实验四磁盘调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验四磁盘调度算法实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统实验四磁盘调度算法实验报告
实验四实验报告
实验源码:
#include"stdio.h"
#include
#include
inta[20];
inti,n,k,init,flag1=1;
//先来先服务
voidFCFS(inta[],intn,intinit)
{
inti,s,sum,temp=0;
intb[20];
for(i=0;ib[i]=a[i];
s=init;
sum=0;
printf("\nFCFS调度结果:
\n");
for(i=0;i{
//被访问的磁道号
printf("%3d\t",b[i]);
//计算移动距离
temp=abs(s-b[i]);
printf("%3d\n",temp);
sum+=temp;
s=b[i];
}
printf("平均寻道长度:
%.1f%%\n\n",sum*1.0/n);
}
//最短寻道法
voidSSTF(inta[],intn,intinit)
{
inti,j,s,sum=0,p,temp=0;
intb[20];
for(i=0;ib[i]=a[i];
printf("\nSSTF调度结果:
\n");
for(i=n-1;i>=0;i--)
{
s=b[0];
p=0;
for(j=0;j<=i;j++)
if(abs(b[j]-init){
s=b[j];
p=j;
}
b[p]=b[i];
//被访问的磁道号
printf("%3d\t",s);
//计算移动距离
temp=abs(s-init);
printf("%3d\n",temp);
sum+=temp;
init=s;
}
printf("平均寻道长度:
%.1f%%\n\n",sum*1.0/n);
}
//扫描算法
voidSCAN(inta[],intn,intinit)
{
inti,j,s,sum=0,p,biaoji,temp=0,k1;
intb[20];
for(i=0;ib[i]=a[i];
printf("\n*****************SCAN扫描算法******************\n");
printf("1.移动臂向磁道号减少的方向2.移动臂向磁道号增加的方向\n");
printf("*******************************************************\n");
printf("请在下面输入您的选择:
");
scanf("%d",&k1);
switch(k1)
{
case1:
//磁道号减小方向
printf("\nSCAN(磁道号减少的方向)调度结果:
\n");
for(i=n-1;i>=0;i--)
{
biaoji=0;
for(j=0;j<=i;j++)
if(b[j]-init<0)
{
biaoji=1;
p=j;
break;
}
if(biaoji==1)
{
s=b[p];
for(j=0;j<=i;j++)
if(b[j]{
s=b[j];
p=j;
}
b[p]=b[i];
//被访问的磁道号
printf("%3d\t",s);
//计算移动距离
temp=init-s;
printf("%3d\n",temp);
sum+=temp;
init=s;
}
else
{
s=b[0];
for(j=0;j<=i;j++)
if(b[j]-init<=s-init)
{
s=b[j];
p=j;
}
b[p]=b[i];
//被访问的磁道号
printf("%3d\t",s);
//计算移动距离
temp=abs(init-s);
printf("%3d\n",temp);
sum+=temp;
init=s;
}
}
break;
case2:
//磁道号增加方向
printf("\nSCAN(磁道号增加方向)调度结果:
\n");
for(i=n-1;i>=0;i--)
{
biaoji=0;
for(j=0;j<=i;j++)
if(b[j]-init>0)
{
biaoji=1;
p=j;
break;
}
if(biaoji==1)
{
s=b[p];
for(j=0;j<=i;j++)
if(b[j]>init&&b[j]-init{
s=b[j];
p=j;
}
b[p]=b[i];
//被访问的磁道号
printf("%3d\t",s);
//计算移动距离
temp=s-init;
printf("%3d\n",temp);
sum+=s-init;
init=s;
}
else
{
s=b[0];
for(j=0;j<=i;j++)
if(init-b[j]<=init-s)
{
s=b[j];
p=j;
}
b[p]=b[i];
//被访问的磁道号
printf("%3d\t",s);
//计算移动距离
temp=abs(init-s);
printf("%3d\n",temp);
sum+=temp;
init=s;
}
}
break;
default:
printf("\n请输入1-2之间的整数!
\n");
break;
}
printf("平均寻道长度:
%.1f%%\n\n",sum*1.0/n);
}
//循环算法
voidCSCAN(inta[],intn,intinit)
{
inttemp;
intk=1;
intl,r,d;
intb[20];
inti,j,sum=0;
intinit_temp=init;
for(i=0;ib[i]=a[i];
for(i=0;i{
for(j=i+1;j{
if(b[i]>b[j])//对磁道号进行从小到大排列
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
if(b[n-1]<=init)//判断整个数组里的数是否都小于当前磁道号
{
printf("\nCSCAN调度结果:
\n");
for(i=0;i{
//被访问的磁道号
printf("%3d\t",b[i]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[i]));
init_temp=b[i];
}
sum=init-b[0]+b[n-1];//计算移动距离
}
elseif(b[0]>=init)//判断整个数组里的数是否都大于当前磁道号
{
printf("\nCSCAN调度结果:
\n");
for(i=0;i{
//被访问的磁道号
printf("%3d\t",b[i]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[i]));
init_temp=b[i];
}
sum=b[n-1]-init;//计算移动距离
}
else
{
while(b[k]{
k++;
}
l=k-1;
r=k;
printf("\n*************循环算法**************\n");
printf("1.移动臂向磁道号减少的方向2.移动臂向磁道号增加的方向\n");
printf("***********************************\n");
printf("请在下面输入您的选择:
");
scanf("%d",&d);
printf("\nCSCAN调度结果:
\n");
switch(d)
{
case1:
//磁道号减小方向
for(j=l;j>=0;j--)
{
//被访问的磁道号
printf("%3d\t",b[j]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[j]));
init_temp=b[j];
}
for(j=n-1;j>=r;j--)
{
//被访问的磁道号
printf("%3d\t",b[j]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[j]));
init_temp=b[j];
}
sum=2*(b[n-1]-b[0])-b[r]+init;//计算移动距离
break;
case2:
//磁道号增加方向
for(j=r;j{
//被访问的磁道号
printf("%3d\t",b[j]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[j]));
init_temp=b[j];
}
for(j=0;j{
//被访问的磁道号
printf("%3d\t",b[j]);
//计算移动距离
printf("%3d\n",abs(init_temp-b[j]));
init_temp=b[j];
}
sum=2*(b[n-1]-b[0])+b[r-1]-init;//计算移动距离
break;
default:
printf("\n请输入1-2之间的整数!
\n");
break;
}
printf("\n平均寻道长度:
%.1f%%\n\n",sum*1.0/n);
}
}
voidDataInput()
{
printf("请输入需要访问的磁道总数:
");
scanf("%d",&n);
printf("\n");
for(i=0;i{
printf("需要访问的磁道%d:
",i+1);
scanf("%d",&a[i]);
}
printf("\n");
printf("请输入指针所在磁道:
");
scanf("%d",&init);
printf("\n");
system("cls");
//显示需要访问的磁道
printf("需要访问的磁道序列为:
");
for(i=0;i{
printf("%d",a[i]);
}
printf("\n");
}
voidmain()
{
DataInput();
intmenu=-1;
while(true)
{
printf("\n*********************************************\n");
printf("磁盘调度算法\n");
printf("*********************************************\n");
printf("**\n");
printf("1.先来先服务(FCFS)2.最短寻道时间优先(SSTF)\n");
printf("3.扫描算法(SCAN)4.循环算法(CSCAN)\n");
printf("5.退出(EXIT)\n");
printf("0.返回上一层(RETURN)\n");
printf("**\n");
printf("*********************************************\n");
printf("请在下面输入您的选择:
");
scanf("%d",&menu);
switch(menu)
{
case1:
FCFS(a,n,init);
break;
case2:
SSTF(a,n,init);
break;
case3:
SCAN(a,n,init);
break;
case4:
CSCAN(a,n,init);
break;
case5:
exit(0);
break;
case0:
system("cls");
DataInput();
break;
default:
break;
}
if(menu!
=1&&menu!
=2&&menu!
=3&&menu!
=4&&menu!
=5&&menu!
=0){
system("cls");
printf("\n请输入0-5之间的整数!
\n");
continue;
}
}
}
实验结果截图:
程序运行:
输入相关数据:
进入选择算法界面:
先来先服务算法:
最短寻道时间优先算法:
扫描算法:
向磁道号减少的方向:
向磁道号增加的方向:
循环算法:
向磁道号减少的方向:
向磁道号增加的方向: