ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:253.39KB ,
资源ID:5987828      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5987828.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(磁盘模拟调度系统实习报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

磁盘模拟调度系统实习报告.docx

1、磁盘模拟调度系统实习报告操作系统实习报告 题目:磁盘模拟调度系统 院系:信息科学与工程学院 日期:2010-7-8目录1. 设计目的 - 1 -2. 设计内容 - 1 -3. 开发环境 - 1 -4. 分析设计 - 1 -4.1. 实验原理 - 1 -4.2. 程序结构 - 2 -4.3. 数据结构 - 2 -4.4. 程序流程图 - 2 -5. 运行示例及结果分析 - 7 -6. 心得与体会 - 9 -7. 参考文献 - 10 -附录:源程序清单 - 10 -磁盘调度管理1. 设计目的加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。同时让我们更好地掌握操作系统的原理及实现方法,加深对

2、操作系统基础理论和重要算法的理解,加强动手能力。2. 设计内容设计一个磁盘调度模拟程序,具体要求如下:1用户可以为程序指定初始需要访问序列;2实现最短寻道和电梯调度两种调度算法;3根据用户的选择输出实际的访问序列;3. 开发环境windows环境,VC6.0平台。4. 分析设计4.1. 实验原理操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需

3、要时再优化旋转等待策略。平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(n),即:L=(M1+M2+Mi+Mn)/n其中Mi为所需访问的磁道号所需移动的磁道数。启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。因此,执行一次输入输出所花的时间有:寻找时间磁头在移动臂带动下移动到指定柱面所花的时间。延迟时间指定扇区旋转到磁头下所需的时间。传送时间由磁头进程读写完成信息传送的时间。其中传送信息所花的时间,是在硬件设计就固定的。而寻找时间和延迟时间是与信息在磁盘上的位置有关。为了减少移动臂进行移动花

4、费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。而是按柱面存放,同一柱面上的各磁道被放满信息后,再放到下一个柱面上。所以各磁盘的编号按柱面顺序(从0号柱面开始),每个柱面按磁道顺序,每个磁道又按扇区顺序进行排序。磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各种进程对磁盘的平均访问时间最小。由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最少。这次磁盘调度模拟系统设计包含了四种算法,除了实验要求的最短寻道和电梯调度两种调度算法外,我还加进了先来先服务算法和循环扫描算法。则这四种算法

5、各自的原理如下:先来先服务算法(First-Come,First-Served,FCFS):这种算法最简单,它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。最短寻道时间优先算法(ShortestSeekTimeFirst,SSTF):该算法选择这样的磁道来优先访问,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。单向扫描算法(SCAN):SCAN算法不仅考虑到欲访问的磁道与当前磁

6、道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。循环扫描算法(CSCAN):这种算法是为了解决某个要访问的磁道(此磁道一般处于处于两个极端:即最外和最里。具体要根据磁头移动方向而定)的请求被严重地推迟。为了减少这种延迟,CSCAN算法规定磁头单向

7、移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。4.2. 程序结构本程序主要包括五部分:即一个主函数,以及四种算法各一个子函数。程序中各子函数相对独立,其算法的实现主要是在主函数中对它们的调用来完成的。在主函数里,首先先定义一个数组,用以存放要访问的所有磁道号信息;定义一个int型变量,用来存储需要访问的磁道的数量;定义一个int型变量,用来保存当前磁头所处的磁道号。接下来就是对原始数据的输入,主要包括当前磁头所处的磁道号、需要访问的磁道的数量和要访问的所有磁道号信息。再下来使用一个while循环实现对各

8、算法的调用,在循环里,先要建立一个选择菜单,以方便用户使用。后面再使用switch语句,并在其各子项中完成对各算法调用。4.3. 数据结构int min 用于存储单步最短距离int first 磁头当前位置int num,n 寻道次数bool flagmaxsize 用于标志各磁道的状态(true/false)(访问/未访问)int array,a 用来存放要访问的所有磁道的磁道号 int sign 用以保存b中和当前位置最近且磁道号大于等于当前位置的数组项的下标; 4.4. 程序流程图主函数程序流程图: 先来先服务算法程序流程图(array, num,first分别为磁头当前位置、要访问的磁

9、道的数量和要访问的所有磁道的磁道号): 最短寻道时间优先算法程序流程图(array, num,first分别为磁头当前位置、要访问的磁道的数量和要访问的所有磁道的磁道号):单向扫描算法程序流程图(array, num,first分别为磁头当前位置、要访问的磁道的数量和要访问的所有磁道的磁道号):循环扫描算法程序流程图(array, num,first分别为磁头当前位置、要访问的磁道的数量和要访问的所有磁道的磁道号):5. 运行示例及结果分析初始数据输入:先来先服务算法:分析:这种算法最简单,其访问顺序和原始输入顺序一致。由运行结果可知:此算法由于未对寻道进行优化,致使平均寻道时间可能较长。寻道

10、最短时间优先算法:分析:这种算法相对复杂。寻道最短时间优先算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。单向扫描算法:分析:SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍只是有利于对中间磁道的请求,两端的磁道仍然有可能出现饥饿现象。循环扫描算法:分析:CSCAN算法中,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描,这种算法可以有效解决两端的磁道仍然有可能出现饥饿现象的问题。6. 心得与体会

11、至此,计算机操作系统实习已经完成。课本上的知识是机械的,表面的。此次的实习,使我对于磁盘调度算法和原理有了更深刻的理解。对于理论在实践中的应用也有一定的了解。通过这次课程设计,全面系统的理解了磁盘调度算法的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。虽然内容并不是很复杂,程序也不够完善和严谨,但是我们觉得设计的过程是相当重要的,从中我学到了很多,收获了很多,无论在理论上还是实践中,都得到不少的提高,这对于我以后的工作和学习都有一种巨大的帮助。我觉得实习反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。我觉得作为一名

12、计算机专业的学生,这次实习是很有意义的。在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。7. 参考文献1汤子瀛,哲凤屏,汤小丹编著. 计算机操作系统.西安电子科技大学出版社, 20052谭浩强编著. C语言程序设计(第3版).清华大学出版社,2005附录:源程序清单#includeiostream.h#includestdio.h#includemath.h#define maxsize 10

13、0void Fcfs(int array,int num,int first); /函数声明void Sstf(int array,int num,int first);void Scan(int array,int num,int first);void Cscan(int array,int num,int first);void main()int amaxsize; /建一个数组,用来存放要访问的所有磁道int c,n,first;cout/*/endl;cout/ 欢迎使用磁盘调度模拟系统 /endl;cout/*/endl;coutn;coutfirst;cout输入要访问的所有磁

14、道:n;for(int i=0;iai; while(1) cout/*/endl; cout/ 磁盘调度模拟系统菜单 /endl; cout/*/endl; cout/* 1. 先来先服务 */endl; cout/* 2. 最短寻道时间优先 */endl; cout/* 3. 单向扫描(电梯调度) */endl; cout/* 4. 循环扫描 */endl; cout/* 5.退出 */endl; cout/*/endl; coutc; coutendl; if(c=5) /如果选择“5”,直接退出 break; switch(c) case 1: cout先来先服务算法的结果:n下一个访

15、问的磁道 移动距离n; Fcfs(a,n,first); break; case 2: coutn最短寻道时间优先算法结果:n下一个访问的磁道 移动距离n; Sstf(a,n,first); break; case 3: coutn扫描算法的结果:n下一个访问的磁道 移动距离n; Scan(a,n,first); break; case 4: coutn循环扫描算法的结果:n下一个访问的磁道 移动距离n; Cscan(a,n,first); break; void Fcfs(int array,int num,int first) /*先来先服务*/ int bmaxsize; int sum

16、=0; /总移动距离 int temp; for(int k=0;knum;k+) coutarrayktt ; temp=arrayk; bk=abs(arrayk-first); /移动距离 coutbkendl; first=temp; /移动到下个磁道 for(int j=0;jnum;j+) sum+=bj; /总移动距离 coutn总寻道长度为:double(sum); /输出寻道总长度 coutn平均寻道长度为:double(sum)/numendl; /输出平均寻道长度void Sstf(int array,int num,int first)/*最短寻道时间优先*/int s

17、um=0; int temp=first;int bmaxsize; /定义一个数组,按访问顺序存放各磁道int number=0;bool flagmaxsize; /定义一个状态数组,用来指示磁道是否被访问,下标对应array数组int min; /设置一个变量,用来存放最短距离(离磁头距离最近且还未被访问的磁道和当前位置的距离)int k,i; min=abs(array0-first); int j=0;for(i=0;inum;i+) /初始化各磁道状态,flag为false,表示该磁道未被访问 flagi=false;while(numbernum) for(k=0;knum;k+

18、) if(flagk=false) min=abs(arrayk-first); j=k;break; for(i=0;iabs(arrayi-first) min=abs(arrayi-first); j=i; bnumber=arrayj;number+;first=arrayj; /设为当前位置flagj=true; /磁道被访问后,flag置为truefor(k=0;knum;k+) first=temp; /first回复初始状态 coutbktt ; temp=bk; bk=abs(bk-first); sum+=bk; coutbkendl;coutn总寻道长度为:double(

19、sum); /输出寻道总长度coutn平均寻道长度:double(sum)/numendl;void Scan(int array,int num,int first)/*扫描(电梯)*/ int bmaxsize; int sum=0; int temp,i,j,k; int sign=num; for(i=0;inum;i+) bi=arrayi; /复制数组 for(i=1;inum;i+) /按磁道从小到大排序 for(j=0;jbj+1) temp=bj; bj=bj+1; bj+1=temp; for(i=0;i=first) sign=i;break; for(j=sign;jn

20、um;j+) /依次访问b下标从sign到num几个磁道,同时依次输出磁道号和单步移动距离 coutbjtt ; coutabs(bj-first)=0;k-) /依次访问b下标从sign-1到0几个磁道,同时依次输出磁道号和单步移动距离 coutbktt ; coutabs(bk-first)endl; sum+=abs(bk-first); first=bk; /设为当前位置 coutn总寻道长度为:double(sum); /输出总寻道长度 coutn平均寻道长度:double(sum)/numendl; void Cscan(int array,int num,int first)/*

21、循环扫描*/ int bmaxsize; int sum=0; int temp,i,j,k; int sign=num; for(i=0;inum;i+) /复制数组 bi=arrayi; for(i=1;inum;i+) /按磁道从小到大排序 for(j=0;jbj+1) temp=bj; bj=bj+1; bj+1=temp; for(i=0;i=first) sign=i;break; /确定标志sign的位置 for(j=sign;jnum;j+) /依次访问b下标从sign到num几个磁道,同时依次输出磁道号和单步移动距离 coutbjtt ; coutabs(bj-first)endl; sum+=abs(bj-first); first=bj; /设为当前位置 for(k=0;ksign;k+) /依次访问b下标从0到sign-1几个磁道,同时依次输出磁道号和单步移动距离 coutbktt ; coutabs(bk-first)endl; sum+=abs(bk-first); first=bk; /设为当前位置 coutn总寻道长度为:double(sum); /输出寻道总长度 coutn平均寻道长度:double(sum)/numendl;

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

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