操作系统实验四磁盘调度算法实验报告.doc
《操作系统实验四磁盘调度算法实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统实验四磁盘调度算法实验报告.doc(15页珍藏版)》请在冰豆网上搜索。
![操作系统实验四磁盘调度算法实验报告.doc](https://file1.bdocx.com/fileroot1/2022-10/4/cd359797-9b22-4731-ae4a-565b8cc339ac/cd359797-9b22-4731-ae4a-565b8cc339ac1.gif)
实验四实验报告
实验源码:
#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;i b[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;i b[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;i b[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;i b[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=