您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统实验七-磁盘调度:先来先服务、最短寻道时间算法
实验报告【实验名称】实验7磁盘调度(一)【实验目的】1.理解、掌握先来先服务(FCFS)算法;2.理解、掌握最短寻道时间(SSTF)算法。【实验原理】先来先服务(FCFS)算法先来先服务算法根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平,简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未寻道进行优化,致使平均寻道时间可以较长。最短寻道时间(SSTF)算法最短寻道时间算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种算法不能保证平均寻道时间最短。【实验内容】模拟实现早期的磁盘调度,编程实现先来先服务和最短寻道时间优先算法。数据结构和符号说明:typedefstructTrack{intTrack_ID;//磁道号intTrack_State;//磁道标志,未被访问置为0}Track;Tracktrack[N];//最大磁道数N为100TracktrackOut[N];intDistance[N];//移动距离intTrack_Num;//需访问的磁道数目intCurrent_Track;//当前磁道intTrackBackup;//存放初始磁道位置算法流程图:先来先服务算法开始基本信息初始化重置,输入开始磁道、访问数和磁道号依次访问数组计算移动距离=|当前位置-目标位置|是否访问完所有磁道?指向下一个磁道否否是否继续?是是是是否否计算平均寻道时间结束最短寻道时间优先算法开始基本信息初始化重置,输入开始磁道、访问数和磁道号依次访问数组,寻找到距离当前磁道最近的磁道计算移动距离=|当前位置-目标位置|是否访问完所有磁道?指向下一个磁道否否是否继续?是是是是否否计算平均寻道时间结束程序代码及截图:/*/*操作系统实验7磁盘调度(一)*/#includestdio.h#includestdlib.h#defineN100typedefstructTrack{intTrack_ID;//磁道号intTrack_State;//磁道标志,未被访问置为0}Track;Tracktrack[N];//最大磁道数为100TracktrackOut[N];intDistance[N];//移动距离intTrack_Num;//需访问的磁道数目intCurrent_Track;//当前磁道intTrackBackup;//存放初始磁道位置voidinit()//初始化,用于在第二次计算时赋予初值{for(inti=0;iTrack_Num;i++){track[i].Track_State=0;trackOut[i].Track_State=0;Distance[i]=0;}}voidInput()//输入函数{printf(输入当前磁道:);scanf(%d,&Current_Track);TrackBackup=Current_Track;printf(输入访问的磁道数目:);scanf(%d,&Track_Num);if(Track_NumN){printf(输入错误:要访问的磁道数目大于最大值。\n);return;}for(inti=0;iTrack_Num;i++){printf(输入第%d个要访问的磁道号:,i+1);scanf(%d,&track[i].Track_ID);}system(cls);//刷新控制台}intabs(inta,intb)//求a-b的绝对值{returna-b=0?a-b:b-a;}voidFCFS()//先来先服务算法{for(inti=0;iTrack_Num;i++){Distance[i]=abs(Current_Track,track[i].Track_ID);//计算当前磁道与目标磁道的移动距离track[i].Track_State=1;//状态置为1,视为已经访问过Current_Track=track[i].Track_ID;//更新当前磁道}}intSerch_min_pos()//寻找到当前磁道最短的需求磁道{intmin=45536;//最小距离标志intpos;for(inti=0;iTrack_Num;i++)if(track[i].Track_State==1)//如果当前磁道已经访问过则跳过continue;elseif(minabs(track[i].Track_ID,Current_Track))//寻找要访问的磁道与当前磁头所在的磁道的距离最近{min=abs(track[i].Track_ID,Current_Track);pos=i;}track[pos].Track_State=1;//标记该磁道已被访问过returnpos;//返回的位置}voidSSTF()//最短寻道优先{for(inti=0;iTrack_Num;i++){trackOut[i]=track[Serch_min_pos()];//更新到要输出的数组中Distance[i]=abs(trackOut[i].Track_ID,Current_Track);//移动距离Current_Track=trackOut[i].Track_ID;//更新当前磁道位置}}voidShow(Tracka[],intchoose)//输出函数{doublesum=0;if(choose==1)printf(当前算法:先来先服务(FCFS)算法\n);elseprintf(当前算法:最短寻道时间优先(SSTF)算法\n);printf(---------------------------------------);printf(\n(从%d号磁道开始)\n,TrackBackup);printf(---------------------------------------\n);printf(被访问的\t|\t移动距离\n);printf(下一个磁道号\t|\t(磁道数)\n);for(inti=0;iTrack_Num;i++){printf(%3d\t\t|\t%3d\n,a[i].Track_ID,Distance[i]);sum+=Distance[i];}printf(---------------------------------------\n);printf(\t平均寻道长度:%3.1f\n,sum/Track_Num);//输出printf(---------------------------------------\n);}intmain(){intchoose;//freopen(1.txt,r,stdin);//从本地文件中读取信息while(1){system(cls);printf(\n\t操作系统实验:磁盘调度(一)\n);printf(----------------------------------------------\n);printf(\t1、先来先服务(FCFS)算法\n);printf(\t2、最短寻道时间优先(SSTF)算法\n);printf(\t3、退出程序\n);printf(----------------------------------------------\n);printf(请输入:);scanf(%d,&choose);init();switch(choose)//返回值是选择{case1://FCFSInput();FCFS();Show(track,choose);break;case2://最短寻道Input();SSTF();Show(trackOut,choose);break;case3://退出return0;default:printf(输入错误,请重新输入。\n);break;}//freopen(con,r,stdin);system(pause);}return0;}实验截图:先来先服务算法输入信息:先来先服务算法结果:最短寻道时间优先算法输入:最短寻道时间优先算法结果:
本文标题:操作系统实验七-磁盘调度:先来先服务、最短寻道时间算法
链接地址:https://www.777doc.com/doc-7382676 .html