模拟实现磁盘调度算法.docx
- 文档编号:16165125
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:15
- 大小:172.18KB
模拟实现磁盘调度算法.docx
《模拟实现磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《模拟实现磁盘调度算法.docx(15页珍藏版)》请在冰点文库上搜索。
模拟实现磁盘调度算法
《操作系统》课程实验
实验课题:
模拟实现磁盘调度算法
姓名:
****
学号:
*****
年级班级:
08级信息与计算科学
教学班级:
操作系统
专业方向:
08信本软件方向
指导教师:
实验时间:
2010-12-9
一、实验名称:
模拟实现磁盘调度算法
1实验目的:
a、观察、体会操作系统的磁盘调度方法,并通过一个简单的磁盘调度模拟程序的实现,加深对磁盘调度的理解。
b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。
2实验要求:
a、使用模块化设计思想来设计。
b、给出主函数和各个算法函数的流程图。
c、学生可按照自身条件,随意选择采用的算法。
二、实验算法分析总流程图
三、实验内容及实验步骤
1实验内容
a、模拟实现磁盘调度算法:
FCFS,最短寻道优先,电梯算法(实现其中之一种以上)。
b、磁道请求服务顺序由用户输入(可通过从指定的文本文件(TXT文件)中取出)。
2实验步骤
1)打开microsoftvasualC++6.0
“开始”菜单—所有程序—单击“microsoftvasualC++6.0”,进入创建页面。
2)单击标题栏“文件”选择“新建”进入界面如下:
选择‘工程,win32consoleapplication’编辑工程名称‘zhuxuemin4’存储在d盘,创建‘创建新工作区’确定。
3)创建文件:
单击标题栏“文件”选择“新建”进入界面类似于上面的界面。
4)在建好的文件中加入附件中的源程序,并进行编译。
四、实验原始记录及结果分析
1先来先服务调度算法
2最短寻道优先调度算法
3电梯调度算法
五、参考代码
#include
#include
#include
#include
constintMAXQUEUE=200;//定义请求队列最大长度//磁道号请求结构体定义
typedefstructTRACK_Node
{intiGo;//要访问的磁道号
intiVisited;//磁道是否已经访问标志(1:
已访问;0:
末访问)}TRACK;
TRACKqueue[MAXQUEUE];//磁道号请求队列数组
intiReqNum=0;//磁道访问请求数
intiStart=0;//磁头初始位置
intiNow=0;//磁头当前位置
intiSum=0;//总移动磁道数
intiInput;//用户当前输入的整数
charsFileName[20];//文件名
voidInit()//初始化函数
{inti;
for(i=0;i {queue[i].iGo=-1;//设置要访问的磁道号为不可能的数-1,以区别正常请求磁道号queue[i].iVisited=0;//设置磁道是否已经访问标志为0: 末访问}}//voidInit() voidReset()//重置访问标志、磁头当前位置、总移动磁道数 {inti; for(i=0;i {queue[i].iVisited=0;//设置磁道是否已经访问标志为0: 末访问 }printf("\n请输入磁头的初始磁道号(整数): "); scanf("%d",&iStart);//从标准输入获取用户当前输入的磁头初始位置 iNow=iStart;//磁头当前位置 iSum=0;//总移动磁道数}//voidReset() intReadTrackFile()//读入磁道号流文件 {FILE*fp; intiTemp; cout<<"\n请输入磁道号流(文本)文件名(注意: 包括后缀名): "; cin>>sFileName;//从标准输入获取用户当前输入的文件名 if((fp=fopen(sFileName,"r"))==NULL) {cout< 磁道号流文件"< ! "< {while(! feof(fp))//将文件中输入的磁道号依次存入磁道号请求队列数组 {fscanf(fp,"%d",&iTemp); queue[iReqNum].iGo=iTemp; iReqNum++;//磁道访问请求数}}//if((fp=fopen(sFileName,"r"))==NULL) return0;}//voidReadTrackFile() voidFCFS()//先来先服务调度算法 {inti; Reset();//重置访问标志、磁头当前位置、总移动磁道数 cout< cout<<"先来先服务调度算法的调度结果: "< cout<<"初始磁道号: "< cout<<"序号下一磁道号移动的磁道数"< for(i=0;i {cout<<""< iSum+=abs(queue[i].iGo-iNow);//累加总移动磁道数 iNow=queue[i].iGo;//设置磁头当前位置为当前访问磁道号} cout< "< cout< "< printf("\n平均移动磁道数: %.2f\n\n",(float)iSum/(float)iReqNum);}//voidFCFS() voidSSTF()//最短寻道优先调度算法 {inti,j; intiNext;//下一磁道号 Reset();//重置访问标志、磁头当前位置、总移动磁道数cout< cout< cout<<"最短寻道优先调度算法的调度结果: "< cout<<"初始磁道号: "< cout<<"序号下一磁道号移动的磁道数"< for(i=0;i {iNext=0; while(queue[iNext].iVisited! =0)//跳过已访问的磁道号 {iNext++;}//while for(j=iNext;j {//寻找下一个寻道距离最短的末访问磁道号 if((queue[j].iVisited==0)&&(abs(iNow-queue[iNext].iGo)>abs(iNow-queue[j].iGo))) {iNext=j;}}//for(j=iNext;j cout<<""< iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数 queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1: 已访问 iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号}//for(i=0;i cout< "< cout< "< printf("\n平均移动磁道数: %.2f\n\n",(float)iSum/(float)iReqNum); }//voidSSTF() voidSCAN()//电梯调度算法 {inti,j; intiNext;//下一磁道号 intiMinMove;//当前方向上最短寻道距离 cout< cout< "< cout<<"1磁头初始向内"< cin>>iInput;//从标准输入获取用户当前输入的整数 switch(iInput)//用户当前输入的整数 {case1: //磁头初始向内 Reset();//重置访问标志、磁头当前位置、总移动磁道数 cout< cout<<"电梯调度算法--磁头初始向内的调度结果: "< cout<<"初始磁道号: "< cout<<"序号下一磁道号移动的磁道数"< for(i=0;i {iMinMove=9999; iNext=-1; for(j=0;j {if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow)) {if(abs(queue[j].iGo-iNow) {iNext=j; iMinMove=abs(queue[j].iGo-iNow); }//if(abs(queue[j].iGo-iNow) }//if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow)) }//for(j=0;j if(iNext! =-1) {cout<<""< iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数 iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号 queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1: 已访问}//if(iNext! =-1) else//掉头向外 {for(j=0;j {if((queue[j].iVisited==0)&&(queue[j].iGo {if(abs(queue[j].iGo-iNow) {iNext=j; iMinMove=abs(queue[j].iGo-iNow); }}}//for(j=0;j cout<<""< iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数 iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号 queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1: 已访问}//if(iNext! =-1)}//for(i=0;i cout< "< cout< "< printf("\n平均移动磁道数: %.2f\n\n",(float)iSum/(float)iReqNum); break; case2: //磁头初始向外 Reset();//重置访问标志、磁头当前位置、总移动磁道数 cout< cout< "< cout<<"初始磁道号: "< cout<<"序号下一磁道号移动的磁道数"< for(i=0;i {iMinMove=9999; iNext=-1; for(j=0;j {if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow)) {if(abs(queue[j].iGo-iNow) {iNext=j; iMinMove=abs(queue[j].iGo-iNow); }//if(abs(queue[j].iGo-iNow) }//if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow)) }//for(j=0;j if(iNext! =-1) {cout<<""< iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数 iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号 queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1: 已访问}else//掉头向内 {for(j=0;j {if((queue[j].iVisited==0)&&(queue[j].iGo>iNow)) {if(abs(queue[j].iGo-iNow) {iNext=j; iMinMove=abs(queue[j].iGo-iNow);}//if(abs(queue[j].iGo-iNow) }//if((queue[j].iVisited==0)&&(queue[j].iGo>iNow))}//for(j=0;j cout<<""< iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数 iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号 queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1: 已访问}//if(iNext! =-1)}//for(i=0;i cout< "< cout< "< printf("\n平均移动磁道数: %.2f\n\n",(float)iSum/(float)iReqNum); break; default: printf("\n输入错误! ! \n\n"); return; }//switch(iInput)}//voidSCAN() voidVersion()//显示版权信息函数 {cout< cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"< cout<<"┃ 磁盘调度算法模拟系统 ┃"< cout<<"┠───────────────────────┨"< cout<<"┃ (c)AllRightReserved ┃"< cout<<"┃ 程坤 ┃"< cout<<"┃ Version2010build2.0 ┃"< cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"< cout< voidmain() {inti; boolbGoOn;//是否继续磁盘调度算法模拟的标志 charsGoOn[1];//用户输入是否继续磁盘调度算法模拟的字母: y、Y、N、nVersion();//显示版权信息函数 Init();//初始化函数 if(ReadTrackFile()==-1)//读入磁道号流文件 {printf("读入磁道号流文件失败! ! \n\n");} else {bGoOn=true; while(bGoOn) {cout< cout<<"从磁道号流文件"< "< for(i=0;i {cout< cout< "< iInput=-1;//用户输入的整数以选择算法 cout< "< cin>>iInput;//从标准输入获取用户当前输入的整数 switch(iInput)//用户输入的整数以选择算法 {case1: FCFS();//先来先服务调度算法 break; case2: SSTF();//最短寻道优先调度算法 break; case3: SCAN();//电梯调度算法 break; default: printf("\n输入的算法编号错误! ! \n\n"); return;}//switch(iInput) bGoOn=false; strcpy(sGoOn,""); cout<<"要继续进行磁盘调度算法模拟吗? (Y/N)"< cin>>sGoOn; bGoOn=(sGoOn[0]=='y'||sGoOn[0]=='Y'); }//whilebGoOn}//if(ReadTrackFile()==-1)} 【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 实现 磁盘 调度 算法