操作系统的课设报告材料磁盘调度算法_第1页
操作系统的课设报告材料磁盘调度算法_第2页
操作系统的课设报告材料磁盘调度算法_第3页
免费预览已结束,剩余8页可下载查看

下载本文档

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

文档简介

1、课程设计报课程名称:操作系统课程设计课题名称:磁盘调度算法学院:软件学院班级:学生姓名:学号:指导教师:磁盘调度算法一、系统需求分析磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取, 是当前存放大量程序和数据的理想设备。所以在现代计算机中都配备了磁盘存储器, 以他为主存放文件, 这样对文件的读、写操 作都涉及到了对磁盘存储器的访问。 磁盘I/O速度的高低和磁盘系统的可靠性, 都直接影响 到系统的性能。因此改善磁盘系统的性能成为现代操作系统的重要任务之一。磁盘性能有数据的组织、磁盘的类型和访问时间等。可以通过选择好的磁盘调度算法, 以减少磁盘的寻道时间。为了减少对文件的访问时间, 应采用一

2、种最佳的磁盘调度算法, 以使各进程对磁盘的平 均访问时间最少。由于在访问磁盘的时间中主要是寻道时间,因此,磁盘调度的目标是使磁盘的寻道时间最少。所以本课程设计对各个算法进行模拟,进而比较分析了解。二、实验内容和目的2.1. 实验内容模拟电梯调度算法,实现对磁盘的驱动调度。设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现1、先来先服务算法(FCFS2、最短寻道时间优先算法(SSTF3、扫描算法(SCAN4、循环扫描算法(CSCAN2.2. 实验原理模拟电梯调度算法,对磁盘调度。磁盘是要供多个进程共享的存储设备,但一个磁盘每个

3、时刻只能为一个进程服务。 当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。三、总体设计及分类简介3.1算法介绍磁盘调度中常用的有四种算法,功能分别如下:1. 先来先服务(FCFS算法。即先来的请求先被响应。FCFS策略看起来似乎是相当”公平”的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复

4、响应从里到外的请求, 那么将会消耗大量的时间。 为了尽量 降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候 FCFS也被看作是最简单的磁盘调度算法。2. 最短寻道时间优先(SSTF)算法。要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。3. 扫描调度(SCAN算法。该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁

5、道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。4. 循环扫描(C-SCAN算法。当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时, 该里程就必须等待,为了减少这种延迟,CSCAf算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程。3.2详细设计功能模块设计(1)先来先服务算法(FCFS3.3环境要求输入磁道名称T输

6、出磁道移动距离及平均磁道长度软件要求:Microsoft Visual Stdio四、程序运行测试首先输入九个磁道名称以及要访问的磁道号和当前磁道号厂田 C:Wi r-dow<2"1 cnrd. exp十0号0百 nsi 追M 的挨 当逵 入入 .前1:«ii 5lb3 丄I9T4T131H选择要执行的算法:Irc“舁 法先>N> M吃优测CA 甘茸引scCS 时d 越尢寻算專2.先来先服务算法(FCFS3.最短寻道时间优先算法(SSTF)继续调度其他算法,选择是1,选择扫描算法(SCAN 2 P1n / 1% fejlg回川蛊產2当殖囉头所电的磁道距哥遗

7、彳排队好CKTRLHX”13? 31 20 132 in 24h印表格丿人丄ewt磁道汁始移动距囲e9010h5ft32a553c391Sh381d1823grl&B132f1&613IJiIB 424平均寻道长底为127 + 5&b否辭统适度耳伯算决号是J否2BI4.扫描算法(SCAN5.循环扫描算法(CSCAN61"印春格f汕.VM环.i (CSCAN>PC 1 卫 1 1 a -J0 石1村8时9%尅F1 t 1 3 3 S 6 0-心礼星法惣藝当M茁整戢方向利进程V7冋峨值勻勻而茲头斯在的嚴谥距禺LE彳:排队 进程询5磁盘&t先亡顺着切门

8、冊_吕0丄50予丄8418 ,3.,395558 90 .莓这硯头移/距:熹为骚驯1H 24 1£E 2H 1 Ife 1 J2平均申适k度劣* 3S.7®,半士士需迴长度人匕 己金总执行宸毕!附:代码#include "stdafx.h"#include <iostream>#include <math.h>#define process_Num9using namespacestd;struct Track int current_Tracknum = 0;/ 当前磁道号int next Track=0;/被访冋的下一个磁道号

9、int move_Distance=0;/ 移动距离char process_Name; ;Track track process_Num;float track_aveLength=O;/ 平均寻道长度int now_Tracknum=0;/最初开始磁道号int select_num = 0;int count_Num=0;/调度算法次数void Scanf_data()printf("请输入要访问磁盘的进程:n");for ( int i = 0; i < process_Num i+) cin >> cess_Name; prin

10、tf("请输入当前的磁道号:");scanf_s( "%d", &now_Tracknum);printf("请输入进程要访问的磁道号:n");for ( int i = 0; i < process_Num i+) scanf_s( "%d", &tracki.next_Track); void Select()printf("请选择磁盘调度算法:n");printf( "1.先来先服务算法(FCFS n");printf( "2.最短寻道时

11、间优先算法(SSTF)n");printf( "3.扫描算法(SCAN)n");printf( "4.循环算法(CSCAN)n');scanf_s( "%d", &select_num);void Print()/打印访问磁盘顺序printf("进程访问磁盘的先后顺序:");for ( int i = 0; i <process_Num i+)printf("%c", cess_Name); printf( "n");for ( in

12、t i = 0; i <process Num i+)printf("%d," , tracki.next Track);printf( "n");void Print_Data()printf("打印表格 n");printf( "tt从 %d#磁道开始 n" , now Tracknum);printf( "t磁道名t磁道号t移动距离n");for ( int i = 0; i <process Num i+)printf( " t%ct %dt %dn",

13、cess_Name, tracki.next_Track,tracki.move Distance);printf( "n");printf( " t平均寻道长度为:%.2fn" , track aveLength);printf(" n");void Count data()int nownum = 0;/当前计算次数for ( int i = 0; i <process Num i+)if (nownum = 0) tracki.move_Distance = abs(now_Tracknum - tra

14、cki.next_Track);tracki.current_Tracknum = tracki.next_Track;nownum+;else tracki.move_Distance = abs(tracki.next_Track - tracki - 1.current_Tracknum); tracki.current_Tracknum = tracki.next_Track; int sum = 0;/计算平均寻道长度时需要的总和printf("每次磁头移动距离为:");for ( int i = 0; i < process_Num i+)/ printf

15、("%d,", tracki.move_Distance);cout << tracki.move_Distance <<""for ( int i = 0; i < process_Num i+)sum = sum + tracki.move_Distance;printf( "n");track_aveLength = ( float )sum / process_Num;printf("平均寻道长度为:%.2f," , track_aveLength) ;printf("

16、;n");void FCFS()count_Num+;printf("按进程提出请求的先后次序进行排队n" ); Print();Count_data(); printf("n");Pri nt Data();|void SSTF()count_Num+;int nownum = 0;/当前计算次数int x10;int xtemp = 0;int tempint;/冒泡排序时需要的临时int型变量(对进程访问磁道号进行排序)int tempchar;/冒泡排序时需要的临时char型变量(对进程名进行排序)printf("按进程访问磁

17、道与当前磁头所在的磁道距离进行排队n");for ( int i = 0; i <process Num; i+) xi = now Tracknum - tracki.next Track; for ( int i = 0; i <process Num - 1; i+)for ( int j = 0; j <process_Num - 1 - i; j+)if (xj>0) && (xj + 1>0) && (xj>xj+ 1) | (xj < 0 && xj + 1 > 0)xtem

18、p = xj;xj = xj + 1;xj + 1 = xtemp;tempint = trackj.next Track;trackj.next_Track = trackj + 1.next_Track; track。+ 1.next_Track = tempint;tempchar = cess_Name;cess_Name = trackj + 1.process_Name;trackj + 1.process_Name = tempchar;if (刈< 0 && xj + 1 < 0)int x1 = abs(xj

19、);int x2 = abs(xj + 1);if (x1>x2)xtemp = xj;xj = xj + 1;xj + 1 = xtemp;tempint = trackj.next_Track;trackj.next_Track = trackj + 1.next_Track;trackj + 1.next_Track = tempint;tempchar = cess_Name;cess Name = trackj + 1.process Name;trackj + 1.process_Name = tempchar; else contin

20、ue ;Print(); Count_data(); printf("n" ); Print_Data();v()id SCAN()count Num+;int nownumint x10;=0;/当前计算次数int xtemp = 0;int tempint;/冒泡排序时需要的临时int型变量(对进程访问磁道号进行排序)int tempchar;/冒泡排序时需要的临时char型变量(对进程名进行排序)|n");printf( "SCAN算法按磁头当前的移动方向和进程访问磁道与当前磁头所在的磁道距离进行排队for ( int i = 0; i <p

21、rocess_Num i+) xi = now_Tracknum - tracki.next_Track; for ( int i = 0; i <process Num- 1; i+)for ( int j = 0; j < process_Num - 1 - i; j+)if (xj>0) && (xj + 1>0) && (xj>xj + 1) | (xj > 0 && xj + 1 < 0)xtemp = xj;xj = xj + 1;xj + 1 = xtemp;tempint = trackj

22、.next_Track;trackj.next Track = trackj + 1.next Track;trackj + 1.next_Track = tempint;tempchar = cess Name;cess_Name = trackj + 1.process_Name;trackj + 1.process Name = tempchar;if (刈< 0 && xj + 1 < 0)int x1 = abs(xj);int x2 = abs(xj + 1);if (x1>x2)xtemp = xj;xj

23、= xj + 1;xj + 1 = xtemp;tempint = trackj.next_Track;trackj.next_Track = trackj + 1.next_Track;trackj + 1.next_Track = tempint;tempchar = cess_Name;cess_Name = trackj + 1.process_Name;trackj + 1.process_Name = tempchar; else continue ;Print(); Count_data();printf("n" );

24、Print_Data();void CSCAN()count_Num+;int nownum = 0;/当前计算次数int x10;int xtemp = 0;int tempint;/冒泡排序时需要的临时int型变量(对进程访问磁道号进行排序)int tempchar;/冒泡排序时需要的临时char型变量(对进程名进行排序)printf( "SCAN算法按磁头当前的移动方向和进程访问磁道与当前磁头所在的磁道距离进行排队n");for ( int i = 0; i <process_Num i+) xi = now_Tracknum - tracki.next_Tra

25、ck; for ( int i = 0; i <process_Num- 1; i+) for ( int j = 0; j <process Num - 1 - i; j+)if (xj>0) && (xj + 1>0) && (xj<xj + 1) | (xj > 0 && xj + 1 < 0)xtemp = xj;xj = xj + 1;xj + 1 = xtemp;tempint = trackj.next Track;trackj.next_Track = trackj + 1.next_Track;trackj + 1.next Track = tempint;tempchar = cess_Name;cess Name = trackj + 1.process Name;trackj + 1.process Name = tempchar;if (xj < 0 && xj + 1 < 0)int x1 = abs(xj);int x2 = abs(xj + 1);if (x1>

温馨提示

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

评论

0/150

提交评论