磁盘调度操作系统实验报告

合集下载

磁盘调度操作系统实验报告

磁盘调度操作系统实验报告

磁盘调度操作系统实验报告一、实验目的:本次实验主要目的是通过模拟实现磁盘调度算法,加深对操作系统磁盘调度原理的理解,并学会使用操作系统磁盘调度算法解决实际问题。

二、实验内容:1.磁盘调度算法原理分析:磁盘调度算法是操作系统中的重要组成部分,它的任务是合理安排磁盘上数据的存取顺序,以提高磁盘的效率。

常见的磁盘调度算法有先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯算法(SCAN)等。

2.模拟实现磁盘调度算法:本实验选择最短寻道时间优先算法(SSTF)作为示例进行模拟实现。

SSTF算法的原理是优先选择离当前磁头位置最近的磁道进行访问,以减少磁头移动时间。

实验步骤:1.根据实际情况,创建一个磁道队列,记录需要访问的磁道序号。

2.初始化磁盘的起始位置和访问队列。

3.对访问队列进行排序,按照磁头当前位置到磁道的距离从小到大排列。

4.根据排序后的队列顺序,依次访问磁道,并记录磁头移动的距离。

5.计算平均寻道长度。

三、实验结果分析:通过模拟实现SSTF磁盘调度算法,我们获得了磁头对每个磁道的访问顺序和总共的磁头移动距离。

根据实验结果,我们可以发现SSTF算法相对于其他算法具有一定的优势。

在实际应用中,根据不同的实际情况,可以选择合适的磁盘调度算法以优化磁盘的访问效率。

四、实验总结:通过本次实验,我们对磁盘调度算法的原理和实现有了更深入的了解。

磁盘调度算法作为操作系统中一个重要的模块,对提高磁盘的读写效率起着重要的作用。

在实际应用中,我们需要根据具体问题选择合适的磁盘调度算法,以达到最优的访问效果。

操作系统磁盘调度算法实验报告及代码

操作系统磁盘调度算法实验报告及代码

操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。

二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。

常见的磁盘调度算法有:FCFS(先来先服务)、SSTF (最短寻道时间)、SCAN(扫描)、C-SCAN(循环扫描)等。

三、实验过程1.编写代码实现磁盘调度算法首先,我们需要定义一个磁盘请求队列,其中存放所有的IO请求。

然后,根据所选的磁盘调度算法,实现对磁盘请求队列的处理和IO请求的调度。

最后,展示运行结果。

以FCFS算法为例,伪代码如下所示:```diskQueue = new DiskQueue(; // 创建磁盘请求队列while (!diskQueue.isEmpty()request = diskQueue.dequeue(; // 取出队列头的IO请求//处理IO请求displayResult(; // 展示运行结果```2.运行实验并记录数据为了验证各种磁盘调度算法的性能差异,我们可以模拟不同的场景,例如,随机生成一批磁盘IO请求,并使用不同的磁盘调度算法进行处理。

记录每种算法的平均响应时间、平均等待时间等指标。

3.撰写实验报告根据实验数据和结果,撰写实验报告。

实验报告通常包括以下内容:引言、实验目的、实验原理、实验步骤、实验结果、实验分析、结论等。

四、实验结果与分析使用不同的磁盘调度算法对磁盘IO请求进行处理,得到不同的实验结果。

通过对比这些结果,我们可以看出不同算法对磁盘IO性能的影响。

例如,FCFS算法对于请求队列中的请求没有排序,可能会导致一些请求等待时间过长。

而SSTF算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。

五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。

不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。

操作系统实验报告—磁盘调度算法

操作系统实验报告—磁盘调度算法

操作系统实验报告—磁盘调度算法操作系统实验报告实验3磁盘调度算法报告日期:20XX-6-17姓名:学号:班级:任课教师:实验3磁盘调度算法一、实验内容模拟电梯调度算法,实现对磁盘的驱动调度。

二、实验目的磁盘是一种高速、大量旋转型、可直接存取的存储设备。

它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。

系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。

驱动调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。

本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。

三、实验原理模拟电梯调度算法,对磁盘调度。

磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。

当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。

假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。

请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。

四、实验过程1.画出算法流程图。

2.源代码#include #include #include int *Init(intarr) {int i = 0;srand((unsignedint)time(0)); for (i = 0; i = num) {a[j+1] = arr[i]; j++; } else {b[k+1] = arr[i]; k++; } }printf(\访问序列:\\n\); for (i = 1; i 0; i--) { printf(\, b[i]); }sum = ((a[j]-100)*2+(100- b[1]))/15;printf(\平均寻道长度:%d\, sum); }int main {int arr[15] = { 0 }; int *ret=Init(arr); two_part(ret); getchar ; return 0;}4运行结果:五、实验小结通过本次实验,我对scan算法更加深入理解,用C语言模拟电梯调度算法,实现对磁盘的驱动调度,这个相比前两个实验实现起来相对简单,理解了算法实现起来尤为简单,程序敲出来之后没有错误,可直接运行,结果验证也无误。

《操作系统》实验六磁盘调度报告

《操作系统》实验六磁盘调度报告

《操作系统》实验六磁盘调度报告磁盘调度是指操作系统对存储在磁盘中的数据进行管理和调度,以提高磁盘的利用率和系统的性能。

在实验六中,我们将学习和实现几种经典的磁盘调度算法,并通过实验比较它们的性能。

本次实验中,我们实现了以下几种磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯算法(SCAN)和循环扫描(C-SCAN)。

下面将对这几种算法进行具体的介绍和分析。

首先是先来先服务算法(FCFS)。

该算法按照请求的顺序进行磁盘访问,先到达的请求先被服务。

该算法实现简单,但是它无法根据磁盘的物理布局情况进行优化,因此可能出现不连续访问磁盘的情况,导致磁盘的寻道时间增加。

实验结果显示,在磁盘请求序列比较随机的情况下,FCFS算法的性能较差。

第二种算法是最短寻道时间优先算法(SSTF)。

该算法选择与当前磁头位置最近的磁道进行访问,以减少寻道时间。

实验结果显示,SSTF算法在磁盘请求序列比较随机的情况下,相较于FCFS算法,可以有效地减少寻道时间。

然而,当一些磁道频繁被请求时,SSTF算法会优先访问该磁道,导致其他磁道的请求被延迟,出现饥饿现象。

第三种算法是电梯算法(SCAN)。

该算法模拟电梯的运行过程,在一个方向上依次访问磁道,直到到达磁盘的最边缘,然后改变方向继续访问。

实验结果显示,SCAN算法可以很好地优化磁盘访问的顺序,减少寻道时间。

但是,SCAN算法可能导致一些请求在磁盘的一侧永远得不到服务,造成饥饿现象。

最后是循环扫描算法(C-SCAN)。

该算法和SCAN算法类似,不同之处是C-SCAN算法在到达磁盘最边缘后,直接返回到磁道的起始位置继续扫描。

实验结果显示,C-SCAN算法可以减少饥饿现象,但是可能出现磁盘一侧被连续访问导致其他区域的访问不均衡。

综上所述,不同的磁盘调度算法在不同的应用场景下有不同的性能表现。

在磁盘请求序列比较随机的情况下,SSTF算法能够最大程度地减少寻道时间。

磁盘调度实验报告实验总结

磁盘调度实验报告实验总结

磁盘调度实验报告实验总结磁盘调度是操作系统中的一个重要概念,它是指操作系统通过合理的算法和策略来管理和调度磁盘上的数据访问请求。

磁盘调度的目的是提高磁盘的读写效率,减少磁盘访问的时间开销,从而提高系统的整体性能。

本次实验主要对比了三种常见的磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先(SSTF)和电梯算法(SCAN)。

通过对比实验结果分析各种算法的性能表现和特点,并给出相应的实验总结。

实验总结如下:一、先来先服务(FCFS)算法FCFS算法是一种简单直接的磁盘调度算法,它按照请求的顺序依次进行访问。

实验结果表明,FCFS算法的平均寻道时间较高,且易产生长期等待现象。

这是因为FCFS算法无法优化磁头的移动顺序,只能按照请求的先后顺序安排磁道的访问,从而导致了较差的性能表现。

二、最短寻道时间优先(SSTF)算法SSTF算法根据当前磁头位置选择距离最近的请求进行服务。

实验结果表明,SSTF算法的平均寻道时间明显优于FCFS算法,且缓解了长期等待现象。

这是因为SSTF算法可以选择离当前磁头位置最近的请求,从而减少了寻道时间,提高了磁道的访问效率。

三、电梯算法(SCAN)算法SCAN算法也称为电梯算法,它模拟了电梯运行的原理。

SCAN算法先将磁头移动到一个极限位置,然后沿着一个方向依次访问请求,直到到达另一个极限位置,再改变方向重复上述过程。

实验结果表明,SCAN算法的平均寻道时间与SSTF 算法相当,且具有较好的均衡性。

这是因为SCAN算法可以使得磁头在磁盘上的行进路线保持平衡,避免了过多的磁道之间的跳跃,从而提高了磁道的访问效率。

综上所述,不同的磁盘调度算法具有不同的性能表现和特点。

在实际应用中,需要根据具体的场景和需求选择合适的磁盘调度算法。

一般而言,SSTF算法和SCAN算法在性能上表现较好,可以提高磁盘的读写效率,减少寻道时间开销。

而FCFS算法在实际应用中较为有限,对于长期等待和寻道时间要求较高的场景不太适用。

磁盘调度的实验报告(3篇)

磁盘调度的实验报告(3篇)

第1篇一、实验目的1. 理解磁盘调度算法的基本原理和重要性。

2. 掌握几种常见的磁盘调度算法,包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)算法。

3. 通过模拟实验,分析不同磁盘调度算法的性能差异。

4. 优化磁盘调度策略,提高磁盘访问效率。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 磁盘调度算法模拟库:PyDiskScheduling三、实验内容1. FCFS算法:模拟实现先来先服务算法,按照请求顺序访问磁盘。

2. SSTF算法:模拟实现最短寻道时间优先算法,优先访问距离当前磁头最近的请求。

3. SCAN算法:模拟实现扫描算法,磁头从0号磁道开始向0号磁道移动,访问所有请求,然后返回到0号磁道。

4. C-SCAN算法:模拟实现循环扫描算法,与SCAN算法类似,但磁头在到达末尾磁道后返回到0号磁道。

四、实验步骤1. 导入PyDiskScheduling库。

2. 创建一个磁盘调度对象,指定磁头初始位置、请求序列和调度算法。

3. 运行调度算法,获取磁头移动轨迹和访问时间。

4. 分析算法性能,包括磁头移动次数、平均访问时间和响应时间等。

五、实验结果与分析1. FCFS算法:在请求序列较短时,FCFS算法表现较好。

但随着请求序列长度增加,磁头移动次数和访问时间明显增加。

2. SSTF算法:SSTF算法在请求序列较短时表现最佳,平均访问时间和响应时间较低。

但当请求序列较长时,算法性能下降,磁头移动次数增加。

3. SCAN算法:SCAN算法在请求序列较短时性能较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。

与SSTF算法相比,SCAN算法在请求序列较长时性能更稳定。

4. C-SCAN算法:C-SCAN算法在请求序列较短时表现较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。

与SCAN算法相比,C-SCAN算法在请求序列较长时性能更稳定,且磁头移动次数更少。

操作系统模拟磁盘调度实验报告

操作系统模拟磁盘调度实验报告

操作系统课程设计成绩单开设时间:2015-2016学年第一学期一、需求分析本实验主要在于用随机生成的磁道序号和初始磁头位置,来模拟磁盘调度的实现过程。

(1)输入的形式和输入值的范围输入的形式是各种命令,由于在图形界面上操作,所以输入值的范围已在图形界面上约束。

(2)输出的形式调用每种磁盘调度方法后,相关结果显示在图像界面上,并以折线图的形式输出调度算法的过程。

(3)程序所能达到的功能能够模拟磁盘调度算法的过程和实现比较。

(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

程序中主要的数据是由程序随机生成磁道序号,用户点击按钮输入选择相关方法;测试得输入方面没有出现意料之外的结果;输出的结果也是各种合理的折线图和比较信息。

二、概要设计(1)程序中主要用到的抽象数据类型程序中主要的抽象数据类型是数组,定义如下:int [] num = new int[400];主要用于存放程序随机生成的400个磁道序号,以便在需要时便于使用。

(2)主程序的流程图(3)各个模块之间的调用关系三、详细设计(1)实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法。

int [] num = new int[400];if(user statrt to use the project){SourceNum sourceNum = new SourceNum();} // 生成随机数于类SourceNum 中使用静态数组保存(2)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度应能够按照伪码算法在计算机键盘上直接输入高级程序设计语言程序)。

主程序If(user select some operate){Show the result;}其他模块Process process = new Process();If(user click one btn){int [] source = new int[400];source = process.getNumbers(); // 获取实验数据give the source to related Chart to make Chart to show;}(3)画出函数的调用关系图。

操作系统实验磁盘调度

操作系统实验磁盘调度

实用操作系统实验报告第十讲磁盘调度算法一、实验概述1. 实验名称磁盘调度算法2. 实验目的通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法;编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。

3. 实验类型验证+设计4. 实验内容理解EOS是如何实现磁盘调度算法的;学习EOS是如何测试磁盘调度算法的,并体会这种测试方法的优缺点。

二、实验环境操作系统:Windows XP 操作系统集成实验环境软件:Tevation OS Lab编译语言:C 参考书:EOS操作系统实验教程三、实验过程1.实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。

****** Disk schedule start working ******Start Cylinder: 10TID: 31 Cylinder: 8 Offset: 2 -TID: 32 Cylinder: 21 Offset: 13 +TID: 33 Cylinder: 9 Offset: 12 -TID: 34 Cylinder: 78 Offset: 69 +TID: 35 Cylinder: 0 Offset: 78 -TID: 36 Cylinder: 41 Offset: 41 +TID: 37 Cylinder: 10 Offset: 31 -TID: 38 Cylinder: 67 Offset: 57 +TID: 39 Cylinder: 12 Offset: 55 -TID: 40 Cylinder: 10 Offset: 2 -Total offset: 360 Transfer times: 10 Average offset: 362.实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一磁盘调度算法实现一、实验目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。

二、实验内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCA)N。

2.1 先来先服务算法(FCFS )这是一种比较简单的磁盘调度算法。

它根据进程请求访问磁盘的先后次序进行调度。

此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

2.2 最短寻道时间优先算法(SSTF )该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。

其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。

在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。

2.3 扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。

这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。

由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。

此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。

2.4 循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。

如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。

这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。

例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。

三、实验流程2.5 系统功能图图3-1 系统功能图 3.2 算法流程图本次实验为实现磁盘调度算法,分别实现四个算法并调试。

四个算法算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCA)N。

四个算法的流程图分析如下。

1)先来先服务算法(FCFS)的流程图图3-2 先来先服务算法的流程图2)最短寻道时间优先算法(SSTF)的流程图图3-3 最短寻道时间优先算法的流程图3)扫描算法(SCAN)的流程图图3-4 扫描算法的流程图4)循环扫描算法(CSCA)N的流程图图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) // 磁道号数组,个数为m{int 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;//输入错误,跳转到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 F;//输入错误,跳转到F,重新输入}else c=trans(str,a);if(c==5) break;if(c>5){cout<<" 输入的数据错误!请重新输入"<<endl;goto G;}switch(c){case 1: //使用FCFS 算法FCFS(cidao,count);break;case 2: //使用SSTF算法SSTF(cidao,count);break;case 3: //使用SCAN 算法SCAN(cidao,count);break;case 4: //使用CSCAN 算法CSCAN(cidao,count);break; }}}五、实验结果2.6程序主界面运行程序后,将会提示用户输入磁道序列,并且以0 结束。

相关文档
最新文档