磁盘调度操作系统试验报告
操作系统 -磁盘调度

磁盘调度算法一、实验目的1、对磁盘调度的相关知识作进一步的了解,明确磁盘调度的原理。
2、加深理解磁盘调度的主要任务。
3、通过编程,掌握磁盘调度的主要算法。
二、实验内容和要求1、对于如下给定的一组磁盘访问进行调度:3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。
4、假定当前读写头在90号,向磁道号增加的方向移动。
三、实验报告1、程序中使用的数据结构及符号说明。
2、给出主要算法的流程图。
3、给出程序清单并附上注释。
4、给出测试数据和运行结果。
#include<iostream>#include<iomanip>#include<math.h>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; //----移动距离;int FindOrder[MaxNumber]; //-----寻好序列。
double AverageDistance; //-----平均寻道长度bool direction; //-----方向 true时为向外,false为向里int BeginNum; //----开始磁道号。
int M; //----磁道数。
int N; //-----提出磁盘I/O申请的进程数int SortOrder[MaxNumber]; //----排序后的序列bool Finished[MaxNumber];void Inith(){cout<<"请输入磁道数(最大磁盘数目):";cin>>M;cout<<"请输入提出磁盘I/O申请的进程数:";cin>>N;cout<<"请依次输入要访问的磁道号:";for(int i=0;i<N;i++)cin>>TrackOrder[i];for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<"请输入开始磁道号:";cin>>BeginNum;for(int k=0;k<N;k++)Finished[k]=false;for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列=================void Sort(){ //------冒泡排序int temp;for(int i=N-1;i>=0;i--)for(int j=0;j<i;j++){if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============先来先服务=================================void FCFS(){int temp;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp); //-------计算移动磁道数temp=TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给tempFindOrder[i]=TrackOrder[i]; //-----寻好的赋给寻好序列}}//========最短寻道法=============================void SSTF(){int temp,n;int A=M;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){for(int j=0;j<N;j++) //-------寻找最短的寻道长度{if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false){A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true; //-------将已经寻找到的Finished赋值为trueMoveDistance[i]=A; //-------寻道长度temp=TrackOrder[n]; //-------当前寻道号。
磁盘管理的实验报告

磁盘管理的实验报告实验报告:磁盘管理一、引言(100字)磁盘是计算机中主要的存储介质之一,磁盘管理是操作系统中的一项重要任务。
本实验旨在通过模拟磁盘管理的相关操作,加深对磁盘管理的理解,并学习实际应用中磁盘管理的策略。
二、实验目的(100字)1.了解磁盘管理的基本原理和相关概念;2.学习磁盘分区的原理及实践;3.理解磁盘调度算法的工作原理;4.掌握常用的磁盘管理策略。
三、实验内容(300字)1.磁盘分区:a.使用磁盘分区工具将物理磁盘划分为若干个分区;b.使用命令查看已分区、格式化后的磁盘分区。
2.磁盘调度算法:a.了解并实现FCFS(先来先服务)、SSTF(最短寻道时间优先)和SCAN(扫描)等磁盘调度算法;b.分别使用模拟程序测试不同算法的性能。
3.磁盘缓存:a.实现一个简单的磁盘缓存管理系统;b.学习并使用命令进行磁盘缓存管理的相关操作。
四、实验步骤(400字)1.磁盘分区:a.打开磁盘分区工具,选择对应磁盘进行分区,设置分区大小和类型;b.格式化已分区的磁盘,创建文件系统;c.使用命令查看分区情况,确认分区操作是否成功。
2.磁盘调度算法:a.阅读并理解给定的FCFS、SSTF和SCAN算法的伪代码;b.根据伪代码实现相应的算法,并进行测试;c.分别使用模拟程序测试不同算法的性能,根据性能结果评估各算法的优劣。
3.磁盘缓存:a.阅读并理解磁盘缓存管理的相关原理和命令;b.实现一个简单的磁盘缓存管理系统,包括缓存页面的替换策略;c.使用命令进行磁盘缓存管理的相关操作,通过测试验证缓存管理系统的正确性。
五、实验结果(150字)1.磁盘分区工具成功将物理磁盘划分为若干个分区,并格式化后创建了文件系统;2.使用命令查看分区情况,确认分区操作成功;3.实现了FCFS、SSTF和SCAN算法,并成功模拟了它们的运行过程;4.使用模拟程序测试了不同算法的性能,分析并比较了各算法的优劣;5.成功实现了一个简单的磁盘缓存管理系统,并通过测试验证了其正确性。
磁盘调度算法实验报告

操作系统实验报告哈尔滨工程大学计算机科学与技术学院磁盘调度算法一.实验概述:1.实验名称:磁盘调度算法2.实验目的:1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;2)观察EOS 实现的FCFS、SSTF 和SCAN 磁盘调度算法,了解常用的磁盘调度算法;3)编写CSCAN 和N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。
3.实验类型:验证、设计4.实验内容:1)准备实验,创建一个EOS Kernel项目;2)验证先来先服务(FCFS)磁盘调度算法;3)验证最短寻道时间优先(SSTF)磁盘调度算法;4)验证SSTF算法造成的线程“饥饿现象”;5)验证扫描(SCAN)磁盘调度算法;6)改写SCAN算法;7)编写循环扫描(CSCAN)磁盘调度算法;8)验证SSTF、SCAN及CSCAN算法中的“磁臂粘着”现象;9)编写N-Step-SCAN磁盘调度算法。
二.实验环境操作系统:windows XP编译器:Tevalaton OS Lab语言:C三.实验过程1.设计思路和流程图:SCAN算法流程图:SSTF算法的流程图:CSACN流程图:N-STEP-SCAN算法调度:Array2.实验过程:1)新建一个EOS Kernel 项目;2)在sysproc.c 文件中找到控制台命令“ds”对应的函数ConsoleCmdDiskSchedule。
“ds”命令专门用来测试磁盘调度算法。
阅读该函数中的源代码,目前该函数使磁头初始停留在磁道10,其它被阻塞的线程依次访问磁道8、21、9、78、0、41、10、67、12、10;3)打开io/block.c 文件,在第378 行找到磁盘调度算法函数IopDiskSchedule。
阅读该函数中的源代码,目前此函数实现了FCFS 磁盘调度算法,流程图如下:4)生成项目,启动调试,待EOS 启动完毕,在EOS 控制台中输入命令“ds”后按回车;在EOS 控制台中会首先显示磁头的起始位置是10 磁道,然后按照线程被阻塞的顺序依次显示线程的信息(包括线程ID 和访问的磁道号)。
操作系统磁盘管理实验报告

实验报告课程名称:操作系统院系:信息与控制工程学院专业班级:计算机0801姓名:指导老师:2010年 12月 31日目录一、实验目的 2二、需求分析 2三概要设计 3四、详细设计 4(1)先来先服务算法(FCFS) 4(2)最短寻道时间优先算法(SSTF) 5(3)电梯算法(SCAN) 7五、调试过程 8六、结论与体会 8七、附件:源程序清单 9一、实验目的本实验的目的是通过设计一个磁盘调度模拟系统,以加深对FCFS、最短寻道时间以及电梯等磁盘调度算法的理解。
让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二、需求分析1、模拟一个磁盘调度算法;Visual C++ 6.0平台2、输入为一组作业的磁道请求;作业的寻到请求可以用一个数组模拟3、要求能够模拟FCFS、最短寻道时间、电梯算法三个磁盘调度算法;FCFS (First Come First Served )先来先服务,在计算机并行任务处理中,被视为最简单的任务排序策略,即是无论任务大小和所需完成时间,对先到的任务先处理,后到的任务后处理。
按照此算法,数组顺序输出即可。
最短寻道时间优先(ShortestSeekTimeFirst,SSTF)要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,确定当前磁道,选择距离当前最近的。
电梯算法,磁臂仅移动到请求的最外道就回转。
反方向查找服务。
确定当前磁道以及运动方向,排序后的数组当前磁道以后的磁道顺序序输出,在将剩余反向输出。
4、输出为按选择的算法执行时的磁头移动轨迹和移动的总道数。
三概要设计系统流程图四、详细设计(1)先来先服务算法(FCFS)先来先服务(FCFS)调度:按先来后到次序服务,未作优化。
最简单的移臂调度算法是“先来先服务”调度算法,这个算法不必考虑当前移臂所在的位置,而只是考虑访问者提出访问请求的先后次序。
.先来先服务算法流程图(2)最短寻道时间优先算法(SSTF)最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短(距离当前移臂最近)的那个请求先执行的,而不管访问者到来的先后次序。
操作系统调度算法实验报告

操作系统调度算法实验报告
本实验旨在研究不同操作系统调度算法在实际应用中的表现和影响。
我们选择了三种常见的调度算法进行对比分析,分别是先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。
1. 实验准备
在开始实验之前,我们首先搭建了一个简单的模拟环境,包括一个CPU和多个进程。
每个进程具有不同的执行时间,以便模拟不同情况
下的调度效果。
2. 先来先服务(FCFS)
先来先服务是最简单的调度算法之一,即根据进程到达的顺序依次
执行。
实验结果显示,FCFS算法适用于处理大量长作业,但当出现短
作业时会导致平均等待时间较长。
3. 最短作业优先(SJF)
最短作业优先算法会优先执行执行时间最短的进程,以减少平均等
待时间。
在我们的实验中,SJF算法表现出色,尤其在短作业较多的情
况下,能够显著提高系统的响应速度。
4. 时间片轮转(RR)
时间片轮转算法将CPU时间分配给每个进程,每个进程执行一个
时间片后轮转到下一个进程。
然而,RR算法可能导致上下文切换频繁,
影响系统效率。
在实验中,我们发现RR算法在处理多任务时效果较好,但在处理长时间任务时表现一般。
5. 实验总结
通过对三种调度算法的实验比较,我们可以看出不同算法在不同情
况下有着不同的优势和劣势。
在实际应用中,需要根据具体情况选择
合适的调度算法,以提高系统的性能和效率。
希望本实验能为操作系
统调度算法的研究提供一定的参考价值。
操作系统课程设计磁盘调度报告

题目:磁盘调度一.设计目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手能力。
二.课程设计内容和要求编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵活选择某算法,且以下算法都要实现:1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)三.算法及数据结构3.1算法的总体思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。
因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间。
其中传送信息所花的时间,是在硬件设计就固定的。
而寻找时间和延迟时间是与信息在磁盘上的位置有关。
为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。
(完整word版)程序模拟磁盘调度设计实验4实验报告
《操作系统》实验报告三、实验过程或算法(源程序)程系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
模块调用关系图:1、先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2、最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
3、扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
4、循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。
磁盘管理 实验报告
磁盘管理实验报告磁盘管理实验报告概述:磁盘管理是计算机操作系统中的重要组成部分,它负责管理计算机系统中的磁盘存储空间,确保数据的高效存取和安全性。
本实验旨在通过实际操作和测试,探究磁盘管理的原理和技术,并评估其对系统性能的影响。
实验目标:1. 理解磁盘管理的基本概念和原理。
2. 掌握磁盘分区和文件系统的创建与管理方法。
3. 了解磁盘调度算法的工作原理和性能特点。
4. 分析磁盘缓存和磁盘阵列技术对系统性能的影响。
实验环境:本次实验使用了一台配置较为普通的计算机,搭载了Windows 10操作系统和500GB机械硬盘。
实验步骤和结果:1. 磁盘分区和文件系统的创建与管理:在Windows 10操作系统中,我们使用了磁盘管理工具对硬盘进行了分区和格式化操作。
通过分区,我们将硬盘划分为多个逻辑驱动器,以便更好地管理和组织数据。
而文件系统的格式化则是为了在磁盘上创建文件系统,并对其进行初始化。
我们选择了NTFS文件系统,因为它支持更大的文件大小和更高的性能。
经过实验操作,我们成功地创建了多个分区,并将它们格式化为NTFS文件系统。
2. 磁盘调度算法的工作原理和性能特点:磁盘调度算法是为了优化磁盘访问的顺序和效率而设计的。
在本次实验中,我们选择了最常用的磁盘调度算法——SCAN算法,并通过实验测试其性能。
我们使用了一个模拟的磁盘访问序列,并记录了SCAN算法下的平均寻道时间和平均旋转延迟时间。
实验结果表明,SCAN算法在磁盘访问效率方面表现出色,能够较好地平衡磁盘访问的延迟和吞吐量。
3. 磁盘缓存和磁盘阵列技术对系统性能的影响:磁盘缓存和磁盘阵列技术是提高磁盘访问性能的两种常见方法。
磁盘缓存利用高速缓存存储器来暂存磁盘数据,以减少对磁盘的实际访问次数,从而提高系统的响应速度。
而磁盘阵列则是通过将多个磁盘组合成一个逻辑单元,实现数据的并行读写,从而提高磁盘的吞吐量。
通过实验测试,我们对比了启用和禁用磁盘缓存以及使用单个磁盘和磁盘阵列的情况下的磁盘访问性能。
磁盘调度算法实验报告
操作系统实验报告哈尔滨工程大学计算机科学与技术学院磁盘调度算法一.实验概述:1.实验名称:磁盘调度算法2.实验目的:1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;2)观察EOS 实现的FCFS、SSTF 和SCAN 磁盘调度算法,了解常用的磁盘调度算法;3)编写CSCAN 和N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。
3.实验类型:验证、设计4.实验内容:1)准备实验,创建一个EOS Kernel项目;2)验证先来先服务(FCFS)磁盘调度算法;3)验证最短寻道时间优先(SSTF)磁盘调度算法;4)验证SSTF算法造成的线程“饥饿现象”;5)验证扫描(SCAN)磁盘调度算法;6)改写SCAN算法;7)编写循环扫描(CSCAN)磁盘调度算法;8)验证SSTF、SCAN及CSCAN算法中的“磁臂粘着”现象;9)编写N-Step-SCAN磁盘调度算法。
二.实验环境操作系统:windows XP编译器:Tevalaton OS Lab语言:C三.实验过程1.设计思路和流程图:SCAN算法流程图:SSTF算法的流程图:CSACN流程图:N-STEP-SCAN算法调度:Array2.实验过程:1)新建一个EOS Kernel 项目;2)在sysproc.c 文件中找到控制台命令“ds”对应的函数ConsoleCmdDiskSchedule。
“ds”命令专门用来测试磁盘调度算法。
阅读该函数中的源代码,目前该函数使磁头初始停留在磁道10,其它被阻塞的线程依次访问磁道8、21、9、78、0、41、10、67、12、10;3)打开io/block.c 文件,在第378 行找到磁盘调度算法函数IopDiskSchedule。
阅读该函数中的源代码,目前此函数实现了FCFS 磁盘调度算法,流程图如下:4)生成项目,启动调试,待EOS 启动完毕,在EOS 控制台中输入命令“ds”后按回车;在EOS 控制台中会首先显示磁头的起始位置是10 磁道,然后按照线程被阻塞的顺序依次显示线程的信息(包括线程ID 和访问的磁道号)。
磁盘电梯调度实验报告
通过本次实验,我们旨在深入了解磁盘电梯调度算法的原理和实现方法,掌握磁盘调度在提高系统性能中的作用。
通过对磁盘电梯调度算法的模拟实现,观察和分析不同调度策略对磁盘访问效率的影响,从而加深对磁盘调度算法的理解。
二、实验环境实验软件:Windows 10操作系统实验工具:Visual Studio 2019实验平台:个人计算机三、实验原理磁盘电梯调度算法是一种常用的磁盘调度策略,其原理类似于电梯的工作方式。
在磁盘调度过程中,磁头从磁盘的一个柱面移动到另一个柱面,就像电梯从一层楼移动到另一层楼。
磁盘电梯调度算法的目标是尽可能减少磁头移动的距离,从而提高磁盘访问效率。
四、实验内容1. FCFS(先来先服务)调度算法FCFS算法按照请求的顺序服务磁盘请求,即先到达的请求先被服务。
该算法实现简单,但效率较低,容易产生“饥饿”现象。
2. SSTF(最短寻找时间优先)调度算法SSTF算法选择距离磁头最近的请求进行服务,以减少磁头移动的距离。
该算法在请求比较均匀时效率较高,但在请求集中时可能会产生“局部最优”问题。
3. SCAN(扫描)调度算法SCAN算法从磁头当前位置开始,向一个方向移动,直到该方向的请求都被服务,然后反向移动。
该算法在请求比较分散时效率较高,但可能会产生“振荡”现象。
4. C-SCAN(循环扫描)调度算法C-SCAN算法与SCAN算法类似,但在到达磁盘末尾时,磁头不返回,而是直接移动到磁盘起始位置,然后继续向一个方向移动。
该算法可以避免“振荡”现象,但可能会产生“局部最优”问题。
1. 初始化创建一个磁盘调度模拟器,包括磁头位置、请求队列、磁盘分区等信息。
2. 调度算法实现根据选择的调度算法,实现相应的磁盘调度策略。
3. 模拟运行输入一系列磁盘请求,按照调度算法进行服务,并记录磁头移动距离、服务时间等指标。
4. 结果分析对不同调度算法的实验结果进行分析,比较它们的性能差异。
六、实验结果与分析1. FCFS算法FCFS算法在实验中表现较差,磁头移动距离较长,服务时间较长。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一磁盘调度算法实现一、实验目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。
二、实验内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
2.1先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2.2最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
2.3扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
2.4循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。
如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
三、实验流程3.1系统功能图图3-1系统功能图3.2算法流程图本次实验为实现磁盘调度算法,分别实现四个算法并调试。
四个算法算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
四个算法的流程图分析如下。
1)先来先服务算法(FCFS)的流程图图3-2先来先服务算法的流程图2)最短寻道时间优先算法(SSTF)的流程图开始输;,.送道m|便目冒痘三排三法■■均长度厂前GE)图3-3最短寻道时间优先算法的流程图3)扫描算法(SCAN)的流程图开始输;,.诚亘三GE)图3-4扫描算法的流程图4)循环扫描算法(CSCAN)的流程图图3-5循环扫描算法的流程图四、源程序#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#define maxsize 1000 /*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效int i=0;while(str[i]!='\0'){if(str[i]<'0'||str[i]>'9'){ return 0;break;) i++;)return i;/****************** 将字符串转换成数字***********************/ int trans(char str[],int a) //将字符串转换成数字int i;int sum=0;for(i=0;i<a;i++) sum=sum+(int)((str[i]-'0')*pow(10,a-i-1)); return sum;)/********************* 冒泡排序算法**************************/ int*bubble(int cidao[],int m)(int i,j;int temp;for(i=0;i<m;i++) //使用冒泡法按从小到大顺序排歹列for(j=i+1;j<m;j++){ if(cidao[i]>cidao[j]){ temp=cidao[i]; cidao[i]=cidao[j]; cidao[j]=temp;))cout<<"排序后的磁盘序列为:";for( i=0;i<m;i++) //输出排序结果cout<<cidao[i]<<"";cout<<endl;return cidao;)/********************* 先来先服务调度算法**************************/ void FCFS(int cidao[],int m) //磁道号数组,个数为mint now;//当前磁道号int sum=0; //总寻道长度int j,i;int a;char str[100];float ave; //平均寻道长度cout<<"磁盘请求序列为:”;for( i=0;i<m;i++) //按先来先服务的策略输出磁盘请求序列cout<<cidao[i]<<"";cout<<endl;cout<<"请输入当前的磁道号:";B:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl; goto B;)else now=trans(str,a); 〃输入当前磁道号sum+=abs(cidao[0] -now);cout<<"磁盘扫描序列为:";for( i=0;i<m;i++) //输出磁盘扫描序列cout<<cidao[i]<<"";for(i=0,j=1;j<m;i++,j++) //求平均寻道长度{sum+=abs(cidao[j]-cidao[i]);ave=(float)(sum)/(float)(m);)cout<<endl;cout<<"平均寻道长度:"<<ave<<endl;)/********************** 最短寻道时间优先调度算法********************/ void SSTF(int cidao[],int m){int k=1;int now,l,r;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";C:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto C;)else now=trans(str,a); 〃输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务cout<<"磁盘扫描序列为:";for(i=m-1;i>=0;i--) cout<<cidao[i]<<"";sum=now-cidao[0];)if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务(cout<<"磁盘扫描序列为:";for(i=0;i<m;i++) cout<<cidao[i]<<"";sum=cidao[m-1]-now;)if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者(cout<<"磁盘扫描序列为:";while(cidao[k]<now) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。
k++;l=k-1;r=k;while((l>=0)&&(r<m)) //当前磁道在请求序列范围内(if((now-cidao[l])<=(cidao[r]-now)) //选择与当前磁道最近的请求给予服务(cout<<cidao[l]<<"";sum+=now-cidao[l];now=cidao[l];l=l-1;)else{cout<<cidao[r]<<"";sum+=cidao[r] -now;now=cidao[r];r=r+1;)))if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道{for(j=r;j<m;j++) cout<<cidao[j]<<"";sum+=cidao[m-1] -cidao[0];)else //磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道for(j=l;j>=0;j--) cout<<cidao[j]<<"";sum+=cidao[m-1] -cidao[0];)ave=(float)(sum)/(float)(m);cout<<endl;cout<<" 平均寻道长度:"<<ave<<endl;) /***************************** 扫描调度算法void SCAN(int cidao[],int m) //先要给出当前磁道号和移动臂的移动方向(int k=1;int now,l,r,d;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";D:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto D;)else now=trans(str,a); //输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=m-1;i>=0;i--)cout<<cidao[i]<<"";sum=now-cidao[0];)if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<"";sum=cidao[m-1]-now;if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者(while(cidao[k]<now) k++;l=k-1;r=k;cout<<"请输入当前移动臂的移动的方向:\n"<<endl;cout<<" 0:表示向内1 :表示向外:"<<endl;cin>>d;if(d==0)//选择移动臂方向向内,则先向内扫描(cout<<"磁盘扫描序列为:";for(j=l;j>=0;j--) cout<<cidao[j]<<" "; //输出向内扫描的序歹列for(j=r;j<m;j++) 〃磁头移动到最小号,则改变方向向外扫描未扫描的磁道cout<<cidao[j]<<" "; //输出向外扫描的序歹歹sum=now-2*cidao[0]+cidao[m-1];)else //选择移动臂方向向外,则先向外扫描(cout<<"磁盘扫描序列为:";for(j=r;j<m;j++) cout<<cidao[j]<<" ";//输出向夕卜扫描的序歹歹for(j=l;j>=0;j--) //磁头移动到最大号,则改变方向向内扫描未扫描的磁道cout<<cidao[j]<<"";sum=-now-cidao[0]+2*cidao[m-1];))ave=(float)(sum)/(float)(m);cout<<endl;cout<<" 平均寻道长度:"<<ave<<endl;) /************************ 循环扫描调度算法/ /void CSCAN(int cidao[],int m)(int k=1;int now,l,r;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";E:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto E;)else now=trans(str,a); 〃输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++) cout<<cidao[i]<<"";sum=now-2*cidao[0]+cidao[m-1];)if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++) cout<<cidao[i]<<"";sum=cidao[m-1]-now;)if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者{cout<<"磁盘扫描序列为:";while(cidao[k]<now) //单向反复地从内向外扫描k++;l=k-1;r=k;for(j=r;j<m;j++) cout<<cidao[j]<<""; 〃输出从当前磁道向外扫描的序歹列for(j=0;j<r;j++)//当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道cout<<cidao[j]<<"";sum=2*cidao[m- 1]+cidao[l] -now-2*cidao[0];)ave=(float)(sum)/(float)(m);cout<<endl;cout<<" 平均寻道长度:"<<ave<<endl;) void main()int a;int c; 〃菜单项int cidao[maxsize];int i=0,count;char str[100];cout<<"请输入磁道序列(输入0结束):"<<endl;A:cin>>str; 〃对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto人;//输入错误,跳转到A,重新输入)else cidao[i]=trans(str,a);i++;while(cidao[i-1]!=0){cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0)cout<<"输入数据的类型错误,请重新输入!"<<endl;else{cidao[i]=trans(str,a);i++;))count=i-1; //要访问的磁道数cout<<"输入的磁道序列为:";for(i=0;i<count;i++) cout<<cidao[i]<<""; 〃输出磁道序歹列cout<<endl;while(1){cout<<endl;cout<<”------------------------------------------------------------------------ "<<endl;cout<<"\n 1.先来先服务 2.最短寻道时间优先 3.扫描调度4.循环扫描5.退出\n"<<endl;cout<<”------------------------------------------------------------------------ "<<endl;G:cout<<"请选择算法:";F:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto FJ/输入错误,跳转到F,重新输入)else c=trans(str,a);if(c==5) break;if(c>5){cout<<"输入的数据错误!请重新输入"<<。