磁盘寻道算法实验报告.docx
《磁盘寻道算法实验报告.docx》由会员分享,可在线阅读,更多相关《磁盘寻道算法实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
磁盘寻道算法实验报告
磁盘寻道算法实验报告
操作系统实验报告四[实验
题目]磁盘调度算法SSTF、SCAN、C-SCAN[实验目的]通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,能使使用者加深对最短寻道时间优先算法、扫描算法以及循环扫描算法的理解。
[实验内容]编程实现如下内容:
1.
最短寻道时间优先算法(SSTF); 2.
扫描算法(SCAN)(又叫电梯调度算法);3.
循环扫描算法(CSCAN)
代码如下:
#define_CRT_SECURE_NO_WARNINGS#include#include#include#include
/_最短寻道时间函数SSTF_/voidSSTF(inta[],intn){
inttemp;
intnow;
intsum=0,i,j,k=0;
//冒泡排序法对磁道号进行排序
printf(“排序后的磁道分布:
\n”);
for(i=0;ifor(j=i+1;jif(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
printf(“%d\t”,a[i]);
if(i%10==9){
printf(“\n”);
}
}
printf(“\n”);
printf(“请输入当前磁道号:
\n”);
scanf(“%d”,;now);
if(a[0]>=now){
printf(“当前访问的磁道%d\n”,a[0]);
for(i=0;iprintf(“当前访问的磁道:
\t%d\n”,a[i+1]);
}
sum=a[n-1]-now;
printf(“移动的总磁道数:
%d\n”,sum);
}
elseif(a[n-1]<=now){
printf(“当前访问的磁道:
%d\n”,a[n-1]);
for(j=n-1;iprintf(“当前访问的磁道:
\t%d\n”,a[j-1]);
}
sum=now-a[0];
printf(“移动的总磁道数:
%d\n”,sum);
}
else{
while(a[k]k++;
}
j=k-1;
i=0;
while((j>=0);;(ki++;
if(now-a[j]>=a[k]-now){
printf(“当前访问的磁道:
\t%d\n”,a[k]);
sum+=a[k]-now;
now=a[k];
k++;
}
else{
printf(“当前访问的磁道:
\t%d\n”,
a[j]);
sum+=now-a[j];
now=a[j];
j--;
}
}
if(k>n-1){
for(intt=j;t>0;t--){
i++;
if(t==j){
printf(“当前访问的磁道:
\t%d\n”,a[j]);
}
else{
printf(“当前访问的磁道:
\t%d\n”,a[t+1]);
}
}
sum+=a[n-1]-a[0];
}
if(j<0){
for(intt=k;ti++;
if(t==k){
printf(“当前访问的磁道:
\t%d\n”,a[k]);
}
else{
printf(“当前访问的磁道:
\t%d\n”,a[t]);
}
}
sum+=a[n-1]-a[0];
}
}
printf(“经过的总磁道数为:
%d\n”,sum);
printf(“移动的平均磁道数:
%.2lf\n”,1.0_sum/n);
printf(“请再次输入你想使用的方法:
\n”);
}/_扫描算法_/voidSCAN(inta[],intn){
inttemp;
intnow;
intsum=0,i,j,k=0;
//冒泡排序法对磁道号进行排序
printf(“排序后的磁道分布:
\n”);
for(i=0;ifor(j=i+1;jif(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
printf(“%d\t”,a[i]);
if(i%10==9){
printf(“\n”);
}
}
printf(“\n请输入当前磁道号:
\n”);
scanf(“%d”,;now);
if(a[0]>=now){
printf(“当前访问的磁道:
%d\n”,a[0]);
for(i=0;iprintf(“当前访问的磁道:
\t%d\n”,a[i+1]);
}
sum=a[n-1]-now;
printf(“移动的总磁道数:
%d\n”,sum);
}
elseif(a[n-1]<=now){
printf(“当前访问的磁道:
%d\n”,a[n-1]);
for(j=n-1;iprintf(“当前访问的磁道:
\t%d\n”,
a[j-1]);
}
sum=now-a[0];
printf(“移动的总磁道数:
%d\n”,sum);
}
else{
intd;
while(a[k]k++;
}
j=k-1;
printf(“请输入当前磁头移动的方向(0向内,1向外):
\n”);
scanf(“%d”,;d);
if(d==1){
for(intt=k;tprintf(“当前访问的磁道:
\t%d\n”,a[t]);
sum+=a[t]-now;
now=a[t];
}
for(intt=j;t>=0;t--){
printf(“当前访问的磁道:
\t%d\n”,a[t]);
}
sum+=a[n-1]-a[0];
}
elseif(d==0){
for(intt=j;t>=0;t--){
printf(“当前访问的磁道:
\t%d\n”,a[t]);
sum+=now-a[t];
now=a[t];
}
for(intt=k;tprintf(“当前访问的磁道:
\t%d\n”,a[t]);
}
sum+=a[n-1]-a[0];
}
else{
printf(“输入错误,重新回到选择算法界面!
\n”);
}
}
printf(“经过的总磁道数为:
%d\n”,sum);
printf(“移动的平均磁道数:
%.2lf\n”,1.0_sum/n);
printf(“请再次输入你想使用的方法:
\n”);}/_循环扫描算法_/voidCSCAN(inta[],intn){
inttemp;
intnow;
intsum=0,i,j,k=0;
//冒泡排序法对磁道号进行排序
printf(“排序后的磁道分布:
\n”);
for(i=0;ifor(j=i+1;jif(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
printf(“%d\t”,a[i]);
if(i%10==9){
printf(“\n”);
}
}
printf(“\n请输入当前磁道号:
\n”);
scanf(“%d”,;now);
if(a[0]>=now){
printf(“当前访问的磁道:
%d\n”,a[0]);
for(i=0;iprintf(“当前访问的磁道:
\t%d\n”,a[i+1]);
}
sum=a[n-1]-now;
printf(“移动的总磁道数:
%d\n”,sum);
}
elseif(a[n-1]<=now){
printf(“当前访问的磁道:
%d\n”,a[n-1]);
for(j=n-1;i>=0;j--){
printf(“当前访问的磁道:
\t%d\n”,a[j-1]);
}
sum=now-a[0];
printf(“移动的总磁道数:
%d\n”,sum);
}
else{
intd;
while(a[k]k++;
}
j=k-1;
printf(“请输入当前磁头移动的方向(0向内,1向外):
\n”);
scanf(“%d”,;d);
if(d==1){
inti=0;
for(intt=k;tprintf(“当前访问的磁道:
\t%d\n”,a[t]);
sum+=a[t]-now;
now=a[t];
}
for(intt=0;tprintf(“当前访问的磁道:
\t%d\n”,
a[t]);
}
sum+=a[n-1]-a[0]+a[j]-a[0];
}
elseif(d==0){
for(intt=j;t>=0;t--){
printf(“当前访问的磁道:
\t%d\n”,
a[t]);
sum+=now-a[t];
now=a[t];
}
for(intt=n-1;t>=k;t--){
printf(“当前访问的磁道:
\t%d\n”,
a[t]);
}
sum+=a[n-1]-a[0]+a[n-1]-a[k];
}
else{
printf(“输入错误,重新回到选择算法界面!
\n”);
}
}
printf(“经过的总磁道数为:
%d\n”,sum);
printf(“移动的平均磁道数:
%.2lf\n”,1.0_sum/n);
printf(“请再次输入你想使用的方法:
\n”);}/_
主函数_/intmain{
intn;//磁道数
intcontrol=1;//控制处理的方式
printf(“请输入要处理的磁道数:
\n”);
scanf(“%d”,;n);
intc[1000];
printf(“随机生成磁道号:
\n”);
srand((unsigned)time(NULL));
//srand((unsigned)time(NULL));
for(inti=0;ic[i]=(rand%100)+1;
printf(“%d\t”,c[i]);
if(i%10==9){
printf(“\n”);
}
}
printf(“\n数据生成成功!
\n”);
printf(“\n”);
printf(“算法选择\n”);
printf(“2.最短寻道时间算法\n”);
printf(“3.扫描算法\n”);
printf(“4.循环扫描算法\n”);
printf(“0.退出程序\n”);
printf(“\n”);
/_算法选择_/
printf(“请输入你想使用的方法:
\n”);
while(control){
scanf(“%d”,;control);
switch(control){
case0:
break;
case2:
SSTF(c,n);
break;
case3:
SCAN(c,n);
break;
case4:
CSCAN(c,n);
break;
default:
printf(“选项错误!
重新选择!
”);
break;
}
}
printf(“程序退出成功,谢谢使用!
”);
system(“pause”);
return0;}
[实验结果]
[心得体会]通过本次试验,我清楚的理解到了磁盘扫描算法;最短寻道算法、循环算法、扫描算法。
在理论理解的基础上又加深了一个层次,但是在到吗过程中还是有很大的欠缺,我会在以后的学习过程中好好的弥
补代码里的错误,提高编写代码的能力。