操作系统实验三磁盘调度算法的实现_第1页
操作系统实验三磁盘调度算法的实现_第2页
操作系统实验三磁盘调度算法的实现_第3页
操作系统实验三磁盘调度算法的实现_第4页
操作系统实验三磁盘调度算法的实现_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第页天津理工大学计算机及通信工程学院实验报告2019至2019学年第一学期课程名称操作系统学号学生姓名年级专业教学班号实验地点实验时间2019年月日第节至月日第节主讲教师辅导教师实验(三)实验名称磁盘调度算法的实现软件环境VC++6.0硬件环境PC机实验目的《操作系统》是计算机科学及技术专业和信息及计算科学专业本科教学计划中的一门重要的专业基础课程,是对计算机系统硬﹑软件资源进行管理的系统软件,是计算机系统的管理和指挥中心。通过本课程实验,使学生综合运用程序设计基础及语言、数据结构、计算机原理及接口等先行课程的知识以及操作系统课程的知识在各种资源管理调度策略下,设计操作系统资源管理的模拟程序,使学生加深了解操作系统的工作机理,对操作系统的功能及结构设计有更加深入的实践,为开发系统软件和应用软件打下基础。实验内容(应包括实验题目、实验要求、实验任务等)实验内容:1、本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。2、实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。3、设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。4、选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。5、按算法的寻道效率进行排序,并对各算法的性能进行分析比较。实验要求:学生应正确地设计有关的数据结构及各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确实验过程及实验结果(可包括实验实施的步骤、算法描述、流程、结论等)在VC++6.0编写如下代码#include<iostream>#include<ctime>usingnamespacestd;voidFCFS(inta[],intn);voidSSTF(inta[],intn);voidSCAN(inta[],intn);voidCSCAN(inta[],intn);intmain(){intn;//磁道的个数ints;//功能号cout<<"请输入磁道的个数:"<<endl;cin>>n;int*a=newint[n];cout<<"生成随机磁道号..."<<endl;srand((unsigned)time(NULL));for(inti=0;i<n;i++){a[i]=(rand()%100)+1; cout<<a[i]<<"";}cout<<endl;while(1){ cout<<endl;cout<<"1、先来先服务算法(FCFS)"<<endl;cout<<"2、最短寻道时间算法(SSTF)"<<endl;cout<<"3、扫描算法(SCAN)"<<endl;cout<<"4、循环扫描算法(CSCAN)"<<endl;cout<<"0、退出"<<endl;cout<<endl;cout<<"请选择功能号:";cin>>s;if(s>4){ cout<<"输入有误!"<<endl;}else{switch(s){case0:exit(0);break;case1:FCFS(a,n);break;case2:SSTF(a,n);break;case3:SCAN(a,n);break;case4:CSCAN(a,n);break;} }} return0;}//先来先服务调度算法(FCFS)voidFCFS(inta[],intn){intsum=0,j,i,first=0,now;cout<<"请输入当前磁道号:";cin>>now;//确定当前磁头所在位置cout<<"磁盘调度顺序为:"<<endl;for(i=0;i<n;i++)//按访问顺序输出磁道号{cout<<a[i]<<"";}//计算sumfor(i=0,j=1;j<n;i++,j++){first+=abs(a[j]-a[i]);//外围磁道及最里面磁道的距离}sum+=first+abs(now-a[0]);cout<<endl;cout<<"移动的总磁道数:"<<sum<<endl;}//最短寻道时间算法(SSTF)voidSSTF(inta[],intn){inttemp;intk=1;intnow,l,r;inti,j,sum=0;//将磁道号按递增排序for(i=0;i<n;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<n;i++){cout<<a[i]<<"";//输出排好的磁道顺序}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//确定当前磁头所在位置cout<<"磁盘调度顺序为:"<<endl;if(a[n-1]<=now)//当前磁头位置大于最外围欲访问磁道{for(i=n-1;i>=0;i--)cout<<a[i]<<"";sum=now-a[0];}elseif(a[0]>=now)//当前磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<"";sum=a[n-1]-now;}else{while(a[k]<now)//确定当前磁道在已排的序列中的位置 {k++; }l=k-1;//在磁头位置的前一个欲访问磁道r=k;//磁头欲访问磁道while((l>=0)&&(r<n)){if((now-a[l])<=(a[r]-now))//选择离磁头近的磁道 {cout<<a[l]<<"";sum+=now-a[l];now=a[l];l=l-1;}else{cout<<a[r]<<"";sum+=a[r]-now;now=a[r];r=r+1;}}if(l=-1)//磁头位置里侧的磁道已访问完{for(j=r;j<n;j++)//访问磁头位置外侧的磁道{cout<<a[j]<<"";}sum+=a[n-1]-a[0];}if(r==n)//磁头位置外侧的磁道已访问完{for(j=k-1;j>-1;j--)//访问磁头位置里侧的磁道{cout<<a[j]<<"";}sum+=a[n-1]-a[0];}}cout<<endl;cout<<"移动的总道数:"<<sum<<endl;}//扫描算法(SCAN)voidSCAN(inta[],intn){inttemp;intk=1;intnow,l,r;inti,j,sum=0;for(i=0;i<n;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<n;i++){cout<<a[i]<<"";}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//以下算法确定磁道访问顺序if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道{for(i=n-1;i>=0;i--)cout<<a[i]<<"";sum=now-a[0];}elseif(a[0]>=now)//磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<"";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==0)//磁头向内 {for(j=l;j>=0;j--) {cout<<a[j]<<""; }for(j=r;j<n;j++) {cout<<a[j]<<""; }sum=now-2*a[0]+a[n-1]; }if(d==1)//磁头向外 { for(j=r;j<n;j++) {cout<<a[j]<<""; }for(j=l;j>=0;j--) {cout<<a[j]<<""; }sum=2*a[n-1]-now-a[0]; } }else cout<<"请输入0或1!"<<endl; }cout<<endl;cout<<"移动的总道数:"<<sum<<endl;}//循环扫描算法(CSCAN)voidCSCAN(inta[],intn){inttemp;intnow,l,r;inti,j,sum=0;intk=1;for(i=0;i<n;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<n;i++){cout<<a[i]<<"";}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//确定当前磁道号if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<"";sum=now-2*a[0]+a[n-1];}elseif(a[0]>=now)//磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<"";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++)//先访问外侧磁道再转向最里欲访问磁道

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论