磁盘调度算法实验报告
磁盘调度算法实验报告

操作系统实验报告哈尔滨工程大学计算机科学与技术学院磁盘调度算法一.实验概述: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 和访问的磁道号)。
磁盘调度操作系统实验报告

磁盘调度操作系统实验报告一、实验目的:本次实验主要目的是通过模拟实现磁盘调度算法,加深对操作系统磁盘调度原理的理解,并学会使用操作系统磁盘调度算法解决实际问题。
二、实验内容: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语言模拟电梯调度算法,实现对磁盘的驱动调度,这个相比前两个实验实现起来相对简单,理解了算法实现起来尤为简单,程序敲出来之后没有错误,可直接运行,结果验证也无误。
磁盘调度实验报告

实验五磁盘调度实验学时:2学时实验类型:设计实验要求:必修一、实验目的:磁盘是高速、大容量、旋转型、可直接存取的存储设备。
它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。
系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。
由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。
本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。
通过实验让学生理解和掌握磁盘调度的职能。
二、实验内容:模拟电梯调度算法,对磁盘进行移臂操作三、提示及要求:1、假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
2、磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。
为此设置“驱动调度”进程。
3、由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。
4、为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:5、“接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:6、“磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。
SCAN算法参考课本第九章。
算法模拟框图略。
7、附图中的“初始化”工作包括:初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。
并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。
磁盘调度实验报告实验总结

磁盘调度实验报告实验总结磁盘调度是操作系统中的一个重要概念,它是指操作系统通过合理的算法和策略来管理和调度磁盘上的数据访问请求。
磁盘调度的目的是提高磁盘的读写效率,减少磁盘访问的时间开销,从而提高系统的整体性能。
本次实验主要对比了三种常见的磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先(SSTF)和电梯算法(SCAN)。
通过对比实验结果分析各种算法的性能表现和特点,并给出相应的实验总结。
实验总结如下:一、先来先服务(FCFS)算法FCFS算法是一种简单直接的磁盘调度算法,它按照请求的顺序依次进行访问。
实验结果表明,FCFS算法的平均寻道时间较高,且易产生长期等待现象。
这是因为FCFS算法无法优化磁头的移动顺序,只能按照请求的先后顺序安排磁道的访问,从而导致了较差的性能表现。
二、最短寻道时间优先(SSTF)算法SSTF算法根据当前磁头位置选择距离最近的请求进行服务。
实验结果表明,SSTF算法的平均寻道时间明显优于FCFS算法,且缓解了长期等待现象。
这是因为SSTF算法可以选择离当前磁头位置最近的请求,从而减少了寻道时间,提高了磁道的访问效率。
三、电梯算法(SCAN)算法SCAN算法也称为电梯算法,它模拟了电梯运行的原理。
SCAN算法先将磁头移动到一个极限位置,然后沿着一个方向依次访问请求,直到到达另一个极限位置,再改变方向重复上述过程。
实验结果表明,SCAN算法的平均寻道时间与SSTF 算法相当,且具有较好的均衡性。
这是因为SCAN算法可以使得磁头在磁盘上的行进路线保持平衡,避免了过多的磁道之间的跳跃,从而提高了磁道的访问效率。
综上所述,不同的磁盘调度算法具有不同的性能表现和特点。
在实际应用中,需要根据具体的场景和需求选择合适的磁盘调度算法。
一般而言,SSTF算法和SCAN算法在性能上表现较好,可以提高磁盘的读写效率,减少寻道时间开销。
而FCFS算法在实际应用中较为有限,对于长期等待和寻道时间要求较高的场景不太适用。
磁盘调度的实验报告(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算法在请求序列较长时性能更稳定,且磁头移动次数更少。
磁盘调度操作系统实验报告

实验一磁盘调度算法实现一、实验目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。
二、实验内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCA)N。
2.1 先来先服务算法(FCFS )这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2.2 最短寻道时间优先算法(SSTF )该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
2.3 扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告哈尔滨工程大学计算机科学与技术学院磁盘调度算法一.实验概述: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流程图:有向内移动的线程?YES NON-STEP-SCAN 算法调度:2.实验过程: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 和访问的磁道号)。
磁盘调度算法执行的过程中,在OS Lab 的“输出”窗口中也会首先显示磁头的起始位置,然后按照线程被唤醒的顺序依次显示线程信息(包括线程ID、访问的磁道号、磁头移动的距离和方向),并在磁盘调度结束后显示此次调度的统计信息(包括总寻道数、寻道次数和平均寻道数)。
对比EOS 控制台和“输出”窗口中的内容,可以发现FCFS 算法是根据线程访问磁盘的先后顺序进行调度的。
下图显示了本次调度执行时磁头移动的轨迹:5)打开sstf.c 文件,该文件提供的IopDiskSchedule 函数实现了SSTF 磁盘调度算法,其中应注意:①变量Offset 是有符号的长整型,用来表示磁头的偏移(包括距离和方向)。
Offset 大于0 时表示磁头向内移动(磁道号增加);小于0 时表示磁头向外移动(磁道号减少);等于0 时表示磁头没有移动。
而名称以“Distance”结尾的变量都是无符号长整型,只表示磁头移动的距离(无方向)。
所以在比较磁头的偏移和距离时,或者在将偏移赋值给距离时,都要取偏移的绝对值(调用C 库函数abs)。
本实验在实现其它磁盘调度算法时也同样遵守此约定;②在开始遍历之前,将最小距离(ShortestDistance)初始化为最大的无符号长整型数,这样,第一次计算的距离一定会小于最小距离,从而可以使用第一次计算的距离来再次初始化最小距离。
本实验在实现其它磁盘调度算法时也同样使用了此技巧。
6)生成项目,启动调试,待EOS 启动完毕,在EOS 控制台中输入命令“ds”后按回车;对比EOS 控制台和“输出”窗口中的内容(特别是线程ID 的顺序),可以发现,SSTF 算法唤醒线程的顺序与线程被阻塞的顺序是不同的。
图18-4显示了本次调度执行时磁头移动的轨迹。
对比SSTF算法与FCFS 算法在“输出”窗口中的内容,可以看出,SSTF 算法的平均寻道数明显低于FCFS 算法。
7)验证SSTF算法造成的线程“饥饿现象”,使用SSTF 算法时,如果不断有新线程要求访问磁盘,而且其所要访问的磁道与当前磁头所在磁道的距离较近,这些新线程的请求必然会被优先满足,而等待队列中一些老线程的请求就会被严重推迟,从而使老线程出现“饥饿”现象。
8)修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、21、9、8、11、41、10、67、12、10,生成项目,启动调试,待EOS 启动完毕,在EOS 控制台中输入命令“ds”后按回车;查看“输出”窗口中显示的内容,可以发现,虽然访问78 号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“饥饿”现象。
如果不断有新线程的请求到达并被优先满足,则访问78 号磁道的线程的“饥饿”情况就会更加严重;修改访问磁道顺序:修改后执行“ds”命令的结果:多次输入“ds”命令:9)对SSTF 算法稍加改进后可以形成SCAN 算法,可防止老线程出现“饥饿”现象。
打开scan.c 文件,该文件提供的IopDiskSchedule 函数实现了SCAN 磁盘调度算法。
其中应注意下面几点:①在block.c 文件中的第374 行定义了一个布尔类型的全局变量ScanInside,用于表示扫描算法中磁头移动的方向。
该变量值为TRUE 时表示磁头向内移动(磁道号增加);值为FALSE 时表示磁头向外移动(磁道号减少)。
该变量初始化为TRUE,表示SCAN 算法第一次执行时,磁头向内移动;②在scan.c 文件的IopDiskSchedule 函数中使用了双重循环。
第一次遍历队列时,查找指定方向上移动距离最短的线程,如果在指定方向上已经没有线程,就变换方向,进行第二次遍历,同样是查找移动距离最短的线程。
在这两次遍历中一定能找到合适的线程。
10)使用scan.c 文件中IopDiskSchedule 函数的函数体,替换block.c 文件中IopDiskSchedule 函数的函数体,生成项目,启动调试,待EOS 启动完毕,在EOS 控制台中输入命令“ds”后按回车;对比SCAN 算法与SSTF 算法在“输出”窗口中的内容,可以看出,SCAN 算法的平均寻道数有可能小于SSTF 算法,所以说SSTF 算法不能保证平均寻道数最少。
下图显示了本次调度执行时磁头移动的轨迹:11)改写SCAN算法,算法提示:①在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次;②在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求;③循环结束后,根据当前磁头移动的方向选择同方向移动距离最短的线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短的线程;流程如下所示:SCAN改写代码:PREQUESTIopDiskSchedule(VOID){PLIST_ENTRY pListEntry;PREQUEST pRequest;PREQUEST INpNextRequest = NULL;PREQUEST OUTpNextRequest = NULL;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0xFFFFFFFF;PREQUEST pNextRequest = NULL;// 需要遍历请求队列一次或两次for (pListEntry = RequestListHead.Next; // 请求队列中的第一个请求是链表头指向的下一个请求。
pListEntry != &RequestListHead; // 遍历到请求队列头时结束循环。
pListEntry = pListEntry->Next) {// 根据链表项获得请求的指针pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);// 计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移(方向由正负表示)Offset = pRequest->Cylinder - CurrentCylinder;if (0 == Offset) {// 如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。
pNextRequest = pRequest;goto RETURN;} else if (Offset<InsideShortestDistance && Offset > 0) {// 记录向内移动距离最短的线程InsideShortestDistance = Offset;INpNextRequest = pRequest;} else if (-Offset < OutsideShortestDistance && Offset < 0) {// 记录向外移动距离最短的线程OutsideShortestDistance = -Offset;OUTpNextRequest = pRequest;}}//判断磁头移动方向,若向内移动if(ScanInside){//判断是否有向内移动的线程if(INpNextRequest){//有则原则该进程return INpNextRequest;}else{//没有则修改磁头方向,选择向外移动距离最短的线程ScanInside=!ScanInside;return OUTpNextRequest;}}//如果向外移动else{//判断是否有向外移动的线程if(OUTpNextRequest){//有则选择该进程return OUTpNextRequest;}else{//没有则修改磁头的方向,选择向内移动距离最短的线程ScanInside =!ScanInside;return INpNextRequest;}}RETURN:return pNextRequest;}修改完SCAN算法后输入“ds”命令:12) 在已经完成的SCAN 算法源代码的基础上进行改写,不再使用全局变量ScanInside 确定磁头移动的方向,而是规定磁头只能从外向内移动。