操作系统实验三磁盘调度算法的实现.docx
- 文档编号:14868825
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:14
- 大小:95.33KB
操作系统实验三磁盘调度算法的实现.docx
《操作系统实验三磁盘调度算法的实现.docx》由会员分享,可在线阅读,更多相关《操作系统实验三磁盘调度算法的实现.docx(14页珍藏版)》请在冰点文库上搜索。
操作系统实验三磁盘调度算法的实现
天津理工大学
计算机与通信工程学院
实验报告
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 ﻩﻩﻩ{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 磁盘 调度 算法 实现