操作系统磁盘管理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告课程名称:操作系统
院系:信息与控制工程学院
专业班级:计算机0801
姓名:
指导老师:
2010年 12月 31日
目录
一、实验目的 2
二、需求分析 2
三概要设计 3
四、详细设计 4
(1)先来先服务算法(FCFS) 4
(2)最短寻道时间优先算法(SSTF) 5
(3)电梯算法(SCAN) 7
五、调试过程 8
六、结论与体会 8
七、附件:源程序清单 9
一、实验目的
本实验的目的是通过设计一个磁盘调度模拟系统,以加深对FCFS、最短寻道时间以及电梯等磁盘调度算法的理解。

让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。

二、需求分析
1、模拟一个磁盘调度算法;
Visual C++ 6.0平台
2、输入为一组作业的磁道请求;
作业的寻到请求可以用一个数组模拟
3、要求能够模拟FCFS、最短寻道时间、电梯算法三个磁盘调度算法;
FCFS (First Come First Served )先来先服务,在计算机并行任务处理中,被视为最简单的任务排序策略,即是无论任务大小和所需完成时间,对先到的任务先处理,后到的任务后处理。

按照此算法,数组顺序输出即可。

最短寻道时间优先(ShortestSeekTimeFirst,SSTF)要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,确定当前磁道,选择距离当前最近的。

电梯算法,磁臂仅移动到请求的最外道就回转。

反方向查找服务。

确定当前磁道以及运动方向,排序后的数组当前磁道以后的磁道顺序序输出,在将剩余反向输出。

4、输出为按选择的算法执行时的磁头移动轨迹和移动的总道数。

三概要设计
系统流程图
四、详细设计
(1)先来先服务算法(FCFS)
先来先服务(FCFS)调度:按先来后到次序服务,未作优化。

最简单的移臂调度算法是“先来先服务”调度算法,这个算法不必考虑当前移臂所在的位置,而只是考虑访问者提出访问请求的先后次序。

.先来先服务算法流程图
(2)最短寻道时间优先算法(SSTF)
最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短(距离当前移臂最近)的那个请求先执行的,而不管访问者到来的先后次序。

现在仍利用同一个例子来讨论,现在当100号柱面的操作结束后,应该先处理99号柱面的请求,然后到达108号柱面执行操作,随后处理129号柱面请求,后继操作的次序应该是142,,156,53,31
最短寻道时间优先算法流程图
(3)电梯算法(SCAN)
SCAN 算法又称电梯调度算法。

SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。

“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。

电梯算法流程图
五、调试过程
将15 25 35 45保存在cidao.txt文件中,运行程序,得到运行结果图如下:
六、结论与体会
通过这次课程设计,我对磁盘调度算法有了更深的认识,在实验时由于好久没用C++编写程序的缘故,进度很慢,不得不下课自己回来加班,但成效是显著的,不仅更了解了这个磁盘调度算法,而且C++也熟悉了起来。

这更使我认识到要将操作系统这门计算机专业的课学好不仅仅是要把书上的基本知识学好而且还要不断进行实践,将所学的跟实践操作结合起来才能更好地巩固所学,提高自己的能力。

七、附件:源程序清单
//先来先服务调度算法
void FCFS(int array[],int m)
{
int sum=0,j,i,now;
for(i=0;i<m;i++)
{
cout<<array[i]<<" ";
}
cout<<" 请输入当前磁道号: "; cin>>now;
for(i=0,j=1;j<m;i++,j++)
{ if(i==0) sum=abs(now-array[i]); sum+=abs(array[j]-array[i]);
}
cout<<"移动的总道数:"<<sum<<endl; }
//最短寻道时间优先调度算法
void ShortPath(int array[],int m) {
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
if(array[i]>array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
for(i=0;i<m;i++)
{
cout<<array[i]<<" ";
}
cout<<"请输入当前的磁道号:";
cin>>now;
if(array[m-1]<=now) {
for(i=m-1;i>=0;i--) cout<<array[i]<<" "; sum=now-array[0];
}
else
if(array[0]>=now) {
for(i=0;i<m;i++) cout<<array[i]<<" "; sum=array[m-1]-now; }
else
{
while(array[k]<now)
{
k++;
}
l=k-1;
r=k;
//确定当前磁道在已排的序列中的位置while((l>=0)&&(r<m))
{
if((now-array[l])<=(array[r]-now)) {
cout<<array[l]<<" ";
sum+=now-array[l];
now=array[l];
l=l-1;
}
else
{cout<<array[r]<<" ";
sum+=array[r]-now; now=array[r];
r=r+1;
}
}
if(l==-1)
{
for(j=r;j<m;j++) {
cout<<array[j]<<" "; sum+=array[j]-now; now=array[j];
}
}
else
{
for(j=1;j>=0;j--)
{
cout<<array[j]<<" ";
sum+=abs(array[j]-now);
now=array[j];
}
}
}
cout<<"移动的总道数:"<<sum<<endl;
}
//电梯调度算法
void Elevator(int array[],int m)/*要给出当前磁道号和移动臂的移动方向*/
{
int temp;
int k=1;
int now,l,r,d;
int i,j,sum=0;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
if(array[i]>array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
for(i=0;i<m;i++)
{
cout<<array[i]<<" ";
}
cout<<"请输入当前的磁道号: "; cin>>now;
if(array[m-1]<=now)
{
for(i=m-1;i>=0;i--) cout<<array[i]<<" "; sum=now-array[0];
}
else
if(array[0]>=now) {
for(i=0;i<m;i++) cout<<array[i]<<" "; sum=array[m-1]-now; }
else
{
while(array[k]<now) {
k++;
}
l=k-1;
r=k;
cout<<"请输入当前移动臂移动的方向(1表示向内,0表示向外):"; cin>>d;
if(d==0)
{
for(j=1;j>=0;j--)
{
cout<<array[j]<<" ";
}
for(j=r;j<m;j++)
{
cout<<array[j]<<" ";
}
sum=now-2*array[0]+array[m-1];
}
else
{
for(j=r;j<m;j++)
{
cout<<array[j]<<" ";
}
for(j=1;j>=0;j--)
{
cout<<array[j]<<" ";
}
sum=-now-array[0]+2*array[m-1];
}
}
cout<<"移动的总道数: "<<sum<<endl; }
//主程序
int main()
{
int c;
FILE *fp;
int cidao[maxsize];
int i=0,count;
fp=fopen("cidao.txt","r+"); if(fp==NULL)
{
cout<<"文件打不开!"<<endl; //exit(0);
}
else
while(!feof(fp))
{
fscanf(fp,"%d",&cidao[i]); i++;
}
count=i;
for(i=0;i<count;i++)
{
cout<<cidao[i]<<" ";
}
cout<<endl;
while(1)
{
cout<<endl<<"系统的菜单如下:"<<endl;
cout<<" 1.先来先服务"<<" 2.最短寻道时间优先"<<" 3.电梯调度"; cout<<endl;
cout<<" 4.退出";
cout<<endl;
cout<<"请选择调度算法:";
cin>>c;
if(c>3)
break;
switch(c)
{
case 1:
FCFS(cidao,count); break;
case 2:
ShortPath(cidao,count); break;
case 3:
Elevator(cidao,count); break;
}
}
getchar();
return 0;}。

相关文档
最新文档