磁盘调度算法的实现.docx
《磁盘调度算法的实现.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法的实现.docx(17页珍藏版)》请在冰豆网上搜索。
磁盘调度算法的实现
操作系统课程设计报告
课程设计题目:
磁盘调度算法的实现
姓名:
啦啦啦
学号:
201211001
班级:
软件1201班
指导教师:
呵呵呵
完成日期:
2014年12月
目录
1.设计目的…………………………………………………………2
2.设计内容…………………………………………………………2
3.设计步骤…………………………………………………………2
3.1.需求分析………………………………………………………2
3.2.详细设计………………………………………………………2
3.3.算法及测试结果………………………………………………3
4.设计总结…………………………………………………………5
5.参考资料…………………………………………………………8
6.源码………………………………………………………………8
1、设计目的:
通过模拟设计磁盘驱动调度程序,观察驱动调度程序的动态运行过程,理解和掌握磁盘驱动调度的职能,并比较各种算法的调度结果。
二、设计内容:
要求设计主界面能灵活选择某算法,且以下算法都要实现。
(1)先来先服务算法(FCFS)
(2)最短寻道时间优先算法(SSTF)
(3)扫描算法(SCAN)
(4)循环扫描算法(CSCAN)
三、设计步骤
(1)需求分析:
本设计中可在运行时随机产生一个请求序列,先把序列排序,以方便找到下一个要寻找的磁道。
要求用户选择磁头移动方向,向里和向外移动用1和0表示,若输入值不为0或1,则报错。
选择某种调度算法后,要求显示调度顺序和移动的总磁道数。
(2)详细设计:
1.先来先服务算法(FCFS)
2.最短寻道时间算法(SSTF)
3.扫描算法(SCAN)
4.循环扫描算法(CSCAN)
(3)算法及测试结果:
1.先来先服务算法(FCFS)及测试结果
2.最短寻道时间算法(SSTF)及测试结果
3.循环扫描算法(SCAN)及测试结果
4.循环扫描算法(CSCAN)测试及结果
四、设计总结:
此次设计基本完成了本实验所规定的功能,但是还不够完善,很多东西做的不够好,程序不够完善和严谨。
由于我的编程基础不是很好,其中不免会有些纰漏,出错处理不够完善等多方面问题,这些都有进一步改善。
在编程设计过程中,由于不知道怎产生不相等的随机数,以及后来的扫描算法和循环扫描算法计算移动总的磁道数都遇到了一点问题,通过上网查询,最后在老师以及同学的指导下很快完成了设计。
此次课程设计中我学到了很多东西,无论在理论上还是实践中,都得到不少的提高,这对于我以后的工作和学习都是一种巨大的帮助!
5、参考资料:
计算机操作系统(第三版)西安电子科技大学出版社
6、源码
#define_CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
/*先来先服务(FCFS)*/
voidFCFS(inta[],intn)
{
intsum=0,i,j,now;
printf("请输入当前磁道号:
\n");
scanf("%d",&now);
sum+=abs(a[0]-now);
printf("从当前位置到第1个磁道移动的磁道数:
\t%d\n",sum);
for(i=0,j=1;jsum+=abs(a[j]-a[i]);
printf("从第%d磁道到第%d磁道移动的磁道数:
\t%d\n",i+1,j+1,abs(a[j]-a[i]));
}
printf("移动的总磁道数:
%d\n",sum);
printf("移动的平均磁道数:
%.2lf\n",1.0*sum/n);
printf("请再次输入你想使用的方法:
\n");
}
/*最短寻道时间函数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");
}
/*主函数*/
voidmain(){
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("-----------------------算法选择-----------------------\n");
printf("------\n");
printf("---1.先来先服务算法---\n");
printf("---2.最短寻道时间算法---\n");
printf("---3.扫描算法---\n");
printf("---4.循环扫描算法---\n");
printf("---0.退出程序---\n");
printf("------\n");
printf("******************************************************\n");
printf("\n");
/*算法选择*/
printf("请输入你想使用的方法:
\n");
while(control){
scanf("%d",&control);
switch(control){
case0:
break;
case1:
FCFS(c,n);
break;
case2:
SSTF(c,n);
break;
case3:
SCAN(c,n);
break;
case4:
CSCAN(c,n);
break;
default:
printf("选项错误!
重新选择!
");
break;
}
}
printf("程序退出成功,谢谢使用!
");
system("pause");
}