操作系统实验三磁盘调度算法的实现.docx

上传人:b****4 文档编号:27192910 上传时间:2023-06-28 格式:DOCX 页数:14 大小:95.33KB
下载 相关 举报
操作系统实验三磁盘调度算法的实现.docx_第1页
第1页 / 共14页
操作系统实验三磁盘调度算法的实现.docx_第2页
第2页 / 共14页
操作系统实验三磁盘调度算法的实现.docx_第3页
第3页 / 共14页
操作系统实验三磁盘调度算法的实现.docx_第4页
第4页 / 共14页
操作系统实验三磁盘调度算法的实现.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

操作系统实验三磁盘调度算法的实现.docx

《操作系统实验三磁盘调度算法的实现.docx》由会员分享,可在线阅读,更多相关《操作系统实验三磁盘调度算法的实现.docx(14页珍藏版)》请在冰豆网上搜索。

操作系统实验三磁盘调度算法的实现.docx

操作系统实验三磁盘调度算法的实现

天津理工大学

计算机与通信工程学院

 

实验报告

 

2013至2014 学年第一 学期

 

课程名称

操作系统

学号

学生姓名

 

年级

 

专业

教学班号

实验地点

 

实验时间

2013年月日第节至月  日第 节

主讲教师

辅导教师

 

实验( 三 )

实验名称

磁盘调度算法的实现

软件环境

 

VC++6.0

硬件环境

 

PC机

实验目的

《操作系统》是计算机科学与技术专业和信息与计算科学专业本科教学计划中的一门重要的专业基础课程,是对计算机系统硬﹑软件资源进行管理的系统软件,是计算机系统的管理和指挥中心。

通过本课程实验,使学生综合运用程序设计基础与语言、数据结构、计算机原理与接口等先行课程的知识以及操作系统课程的知识在各种资源管理调度策略下,设计操作系统资源管理的模拟程序,使学生加深了解操作系统的工作机理,对操作系统的功能及结构设计有更加深入的实践,为开发系统软件和应用软件打下基础。

实验内容(应包括实验题目、实验要求、实验任务等)

实验内容:

1、本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。

2、实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和 NStepSCAN算法。

3、设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。

4、选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

5、按算法的寻道效率进行排序,并对各算法的性能进行分析比较。

实验要求:

学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确

实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)

在VC++6.0编写如下代码

#include

#include

using namespacestd;

voidFCFS(inta[],intn);

voidSSTF(inta[],intn);

voidSCAN(inta[],intn);

voidCSCAN(int a[],int n);

int main()

   int n;//磁道的个数

 ints;//功能号

cout<<"请输入磁道的个数:

"<

  cin>>n;

int *a=newint[n];

  cout<<"生成随机磁道号..."<<endl;

 srand((unsigned)time(NULL));

for(inti=0;i<n;i++)

{

   a[i]=(rand()%100)+1;

   cout<

   cout<

while

(1){

ﻩcout<<endl;

  cout<<"1、先来先服务算法(FCFS)"<<endl;

 cout<<"2、最短寻道时间算法(SSTF)"<<endl;

cout<<"3、扫描算法(SCAN)"<<endl;

  cout<<"4、循环扫描算法(CSCAN)"<<endl;

  cout<<"0、退出"<<endl;

 cout<

cout<<"请选择功能号:

";

cin>>s;

if(s>4){

ﻩcout<<"输入有误!

"<<endl;}

 else{

   switch(s){  case0:

exit(0);break ; 

    case 1:

FCFS(a,n);break;

   case2:

SSTF(a,n);break;

     case3:

SCAN(a,n);break;

    case4:

CSCAN(a,n);break;}ﻩ   }}

return 0;}

//先来先服务调度算法(FCFS)

void FCFS(inta[],intn){

intsum=0,j,i,first=0,now;

cout<<"请输入当前磁道号:

";

cin>>now;//确定当前磁头所在位置

cout<<"磁盘调度顺序为:

"<<endl;

for(i=0;i

cout<<a[i]<<"";}

//计算sum

for(i=0,j=1;j

first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离 

sum+=first+abs(now-a[0]);

cout<<endl;

cout<<"移动的总磁道数:

"<<sum<

//最短寻道时间算法(SSTF)

voidSSTF(inta[],int n){

inttemp;

intk=1;

intnow,l,r;

int i,j,sum=0;

//将磁道号按递增排序

for(i=0;i<n;i++)

for(j=i+1;j

  if(a[i]>a[j])

 {

  temp=a[i];

 a[i]=a[j];

a[j]=temp;}}

cout<<"按递增顺序排好的磁道:

"<<endl;

for(i=0;i

cout<<a[i]<<"";//输出排好的磁道顺序

}

cout<

cout<<"请输入当前的磁道号:

";

cin>>now;//确定当前磁头所在位置

cout<<"磁盘调度顺序为:

"<<endl;

if(a[n-1]<=now)//当前磁头位置大于最外围欲访问磁道

  for(i=n-1;i>=0;i--)

 cout<<a[i]<<" ";

sum=now-a[0];}

else

if(a[0]>=now)//当前磁头位置小于最里欲访问磁道

{

  for(i=0;i<n;i++)

cout<

sum=a[n-1]-now;}

 else{

 while(a[k]

ﻩ{

 k++;

  l=k-1;//在磁头位置的前一个欲访问磁道

  r=k;//磁头欲访问磁道

 while((l>=0)&&(r

if((now-a[l])<=(a[r]-now))//选择离磁头近的磁道

ﻩ{

cout<

 sum+=now-a[l];

 now=a[l];

    l=l-1;}

 else{

 cout<

sum+=a[r]-now;

 now=a[r];

   r=r+1;}}

 if(l=-1)//磁头位置里侧的磁道已访问完

 {

 for(j=r;j

{

 cout<

sum+=a[n-1]-a[0];}

if(r==n)//磁头位置外侧的磁道已访问完

{

for(j=k-1;j>-1;j--) //访问磁头位置里侧的磁道

  {

   cout<

    sum+=a[n-1]-a[0];} }

cout<<endl;

cout<<"移动的总道数:

"<

}

//扫描算法(SCAN)

void SCAN(inta[],int n)

{

inttemp;

intk=1;

intnow,l,r;

inti,j,sum=0;

for(i=0;i

 for(j=i+1;j<n;j++)

{

 if(a[i]>a[j])

 {

temp=a[i];

 a[i]=a[j];

 a[j]=temp;

 }

}

cout<<"按递增顺序排好的磁道:

"<<endl;

for(i=0;i

{

cout<<a[i]<<"";

}

cout<

cout<<"请输入当前的磁道号:

";

cin>>now;

//以下算法确定磁道访问顺序

 if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道

 {

for(i=n-1;i>=0;i--)

 cout<<a[i]<<"";

   sum=now-a[0];

   else

if(a[0]>=now)//磁头位置小于最里欲访问磁道

  {

     for(i=0;i<n;i++)

    cout<<a[i]<<"";

 sum=a[n-1]-now;

 }

  else     //磁头位置在最里侧磁道与最外侧磁道之间

 {intd;

   while(a[k]

  {   //确定当前磁道在已排的序列中的位置

       k++;

  }

    l=k-1;//在磁头位置的前一个欲访问磁道

   r=k;//磁头欲访问磁道

      cout<<"请输入当前磁头移动的方向 (0表示向内,1表示向外):

 ";

    cin>>d;  //确定磁头访问的方向

   cout<<"磁盘调度顺序为:

";

   if(d==0||d==1)

ﻩﻩ{

  if(d==0) //磁头向内

ﻩ {

    for(j=l;j>=0;j--)

ﻩﻩﻩﻩ{

   cout<

ﻩﻩ}

       for(j=r;j

ﻩﻩ{

         cout<

ﻩﻩﻩﻩ}

    sum=now-2*a[0]+a[n-1];

ﻩﻩ}

    if(d==1)      //磁头向外

ﻩﻩ{

ﻩﻩfor(j=r;j

ﻩﻩﻩﻩﻩ{

      cout<<a[j]<<"";

ﻩﻩ}

      for(j=l;j>=0;j--)

ﻩ{

        cout<

ﻩﻩﻩﻩ}

      sum=2*a[n-1]-now-a[0];

ﻩﻩﻩﻩ}

ﻩﻩ }

   else

ﻩcout<<"请输入0或1!

"<<endl;ﻩ 

ﻩ}

 cout<<endl;

 cout<<"移动的总道数:

"<

//循环扫描算法(CSCAN)

voidCSCAN(inta[],int n)

{

int temp;

int now,l,r;

int i,j,sum=0;

intk=1;

for(i=0;i<n;i++)//对访问磁道按由小到大顺序排列输出

for(j=i+1;j

 {

if(a[i]>a[j])

{

temp=a[i];

   a[i]=a[j];

 a[j]=temp;

ﻩ}

}

cout<<"按递增顺序排好的磁道:

"<

  for(i=0;i<n;i++)

{

  cout<

 }

 cout<

cout<<"请输入当前的磁道号:

";

cin>>now;//确定当前磁道号

if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道

{

 for(i=0;i<n;i++)

  cout<

  sum=now-2*a[0]+a[n-1];

  }

else

   if(a[0]>=now)//磁头位置小于最里欲访问磁道

     {

 for(i=0;i<n;i++)

  cout<

 sum=a[n-1]-now;

 }

   else //磁头位置在最里侧磁道与最外侧磁道之间

  {intd;

       while(a[k]<now)

 {

  k++;

   }

 l=k-1;//在磁头位置的前一个欲访问磁道

 r=k; //磁头欲访问磁道

ﻩﻩcout<<"请输入当前磁头移动的方向(0表示向内,1表示向外):

";

  cin>>d; //确定磁头访问的方向

ﻩ cout<<"磁盘调度顺序为:

";

    if(d==0||d==1)

ﻩ{

 if(d==1)  //磁头向外侧访问

ﻩﻩ {

  for(j=r;j<n;j++)//先访问外侧磁道再转向最里欲访问磁道

ﻩﻩ{

   cout<

ﻩﻩ}

       for(j=0;j

ﻩﻩﻩ{

  cout<

ﻩ}

   sum=2*a[n-1]-now-2*a[0]+a[l];

ﻩﻩ}

      if(d==0)    //磁头向内侧访问

ﻩﻩ{

ﻩﻩfor(j=r-1;j>=0;j--)

ﻩﻩﻩ{

 cout<<a[j]<<" ";

ﻩﻩﻩﻩ}

ﻩfor(j=n-1;j>=r;j--)//

ﻩﻩ{

    cout<

ﻩﻩ}

ﻩﻩsum=2*a[n-1]-2*a[0]+now-a[r];

ﻩﻩ}

ﻩ}

ﻩ else

cout<<"请输入0或1!

";

   } 

cout<<endl;

cout<<"移动的总道数:

 "<

}

实验结果:

1.先来先服务算法(FCFS)测试结果

2.最短寻道时间算法(SSTF)测试结果

3.循环扫描算法(SCAN)测试结果

4.循环扫描算法(CSCAN)测试结果

由以上测试结果可知,在相同的实验前提下,SSTF移动的总道数最少,性能最优

 

附录(可包括源程序清单或其它说明)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1