操作系统实验第五讲 磁盘调度算法文档格式.docx

上传人:b****6 文档编号:16138372 上传时间:2022-11-20 格式:DOCX 页数:31 大小:516.90KB
下载 相关 举报
操作系统实验第五讲 磁盘调度算法文档格式.docx_第1页
第1页 / 共31页
操作系统实验第五讲 磁盘调度算法文档格式.docx_第2页
第2页 / 共31页
操作系统实验第五讲 磁盘调度算法文档格式.docx_第3页
第3页 / 共31页
操作系统实验第五讲 磁盘调度算法文档格式.docx_第4页
第4页 / 共31页
操作系统实验第五讲 磁盘调度算法文档格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

操作系统实验第五讲 磁盘调度算法文档格式.docx

《操作系统实验第五讲 磁盘调度算法文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验第五讲 磁盘调度算法文档格式.docx(31页珍藏版)》请在冰豆网上搜索。

操作系统实验第五讲 磁盘调度算法文档格式.docx

计算机科学

及技术学院

指导教师

初妍

实验室名称地点

21#428

哈尔滨工程大学

计算机科学及技术学院

第六讲磁盘调度算法

一、实验概述

1.实验名称

2.实验目

(1)通过学习EOS实现磁盘调度算法机制,掌握磁盘调度算法执行条件和时机;

(2)观察EOS实现FCFS、SSTF和SCAN磁盘调度算法,了解常用磁盘调度算法;

(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法理解。

3.实验类型

验证性+设计性实验

4.实验内容

(1)验证先来先服务(FCFS)磁盘调度算法;

(2)验证最短寻道时间优先(SSTF)磁盘调度算法;

(3)验证SSTF算法造成线程“饥饿”现象;

(4)验证扫描(SCAN)磁盘调度算法;

(5)改写SCAN算法。

二、实验环境

在OSLab实验环境基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。

三、实验过程

1.设计思路和流程图

(1)改写SCAN算法

在已有SCAN算法源代码基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中请求,就可以选中下一个要处理请求。

算法流程图如下图所示。

图3.1.1SCAN算法IopDiskSchedule函数流程图

(2)编写循环扫描(CSCAN)磁盘调度算法

在已经完成SCAN算法源代码基础上进行改写,不再使用全局变量ScanInside确定磁头移动方向,而是规定磁头只能从外向内移动。

当磁头移动到最内被访问磁道时,磁头立即移动到最外被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。

图3.1.2CSCAN算法IopDiskSchedule函数流程图

(3)编写N-Step-SCAN磁盘调度算法

在已经完成SCAN算法源代码基础上进行改写,将请求队列分成若干个长度为N子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。

图3.1.3N-Step-SCAN算法IopDiskSchedule函数流程图

2.算法实现

在一次遍历中,不再关心当前磁头移动方向,而是同时找到两个方向上移动距离最短线程所对应请求,这样就不再需要遍历两次。

在计算出线程要访问磁道及当前磁头所在磁道偏移后,可以将偏移分为三种类型:

偏移为0,

表示线程要访问磁道及当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应请求指针;

偏移大于0,记录向内移动距离最短线程对应请求;

偏移小于0,记录向外移动距离最短线程对应请求。

循环结束后,根据当前磁头移动方向选择同方向移动距离最短线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短线程。

由于规定了磁头只能从外向内移动,所以在每次遍历中,总是同时找到向内移动距离最短线程和向外移动距离最长线程。

注意,及SCAN算法查找向外移动距离最短线程不同,这里查找向外移动距离最长线程。

在开始遍历前,可以将用来记录向外移动最长距离变量赋值为0。

在计算出线程要访问磁道及当前磁头所在磁道偏移后,同样可以将偏移分为三种类型:

偏移为0,表示线程要访问磁道及当前磁头所在磁道相同,此情况应优先被调度,可立即返回该线程对应请求指针;

偏移小于0,记录向外移动距离最长线程对应请求。

循环结束后,选择向内移动距离最短线程,如果没有向内移动线程,就选择向外移动距离最长线程。

在block.c文件中第360行定义了一个宏SUB_QUEUE_LENGTH,表示子队列长度(即N值)。

目前这个宏定义值为6。

在第367行定义了一个全局变量SubQueueRemainLength,表示第一个子队列剩余长度,并初始化其值为SUB_QUEUE_LENGTH。

在执行N-Step-SCAN算法时,要以第一个子队列剩余长度做为计数器,确保只遍历第一个子队列剩余项。

所以,结束遍历条件就既包括第一个子队列结束,又包括整个队列结束(如果整个队列长度小于第一个子队列剩余长度)。

注意,不要直接使用第一个子队列剩余长度做为计数器,可以定义一个新局部变量来做为计数器。

按照SCAN算法从第一个子队列剩余项中选择一个合适请求。

最后,需要将第一个子队列剩余长度减少1(SubQueueRemainLength减少1),如果第一个子队列剩余长度变为0,说明第一个子队列处理完毕,需要将子队列剩余长度重新变为N(SubQueueRemainLength重新赋值为SUB_QUEUE_LENGTH),从而开始处理下一个子队列。

3.需要解决问题及解答

(1)实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中结果。

答:

先来先服务(FCFS)磁盘调度算法在“输出”窗口中结果如下图所示。

图3.3.1

(2)实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中结果。

最短寻道时间优先(SSTF)磁盘调度算法在“输出”窗口中结果如下图所示。

图3.3.2

(3)实验指导P178-3.4验证SSTF算法造成线程“饥饿”现象,要求请给出在“输出”窗口中结果。

SSTF算法造成线程“饥饿”现象在“输出”窗口中结果如下图所示。

图3.3.3

(4)实验指导P179-3.5验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》P176-3.2节中数据)和饥饿(即《实验指导》P178-3.4节中数据)请给出在“输出”窗口中结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。

在非饥饿情况下,“输出”窗口中结果如下图所示。

图3.3.4

在饥饿情况下,“输出”窗口中结果如下图所示。

图3.3.5

ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出结果会不一样。

(5)在执行SCAN、N-Step-SCAN磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度顺序会发生变化,说明造成这种现象原因(提示:

注意这两种算法使用全局变量)。

尝试修改源代码,使这两种算法在多次执行时,都能确保调度顺序一致(提示:

可以参考io/block.c文件中IopReceiveRequest函数和IopProcessNextRequest函数判断磁盘调度算法开始工作和结束工作方法)。

只需在for循环结束后添加如下代码,就能确保调度顺序一致。

图3.3.6

(6)尝试在io/block.c文件中定义一个全局函数指针变量DiskScheduleFunc,该函数指针初始指向实现了FCFS算法IopDiskSchedule函数。

修改io/block.c文件中IopProcessNextRequest函数,在该函数中不再直接调用IopDiskSchedule函数,而是调用函数指针DiskScheduleFunc指向磁盘调度算法函数;

ke/sysproc.c文件中ConsoleCmdDiskSchedule函数中也不再直接调用IopDiskSchedule函数,也要修改为调用函数指针DiskScheduleFunc指向磁盘调度算法函数。

最后,添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc指向实现了SSTF算法函数。

这样,在EOS启动后默认会执行FCFS算法,执行控制台命令“sstf”后,会执行SSTF算法。

按照这种方式依次实现“fcfs”、“scan”、“cscan”和“nstepscan”命令。

说明这种在EOS运行时动态切换磁盘调度算法好处。

首先在block.c中定义一个全局函数指针变量DiskScheduleFunc。

图3.3.7

修改IopProcessNextRequest函数和ConsoleCmdDiskSchedule函数,使其不再直接调用IopDiskSchedule函数而是调用函数指针DiskScheduleFunc指向磁盘调度算法函数。

图3.3.8

调用函数前先声明。

图3.3.9

添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc指向实现了SSTF算法函数。

图3.3.10

验证结果如下图所示。

图3.3.11

图3.3.12

 

(7)分析已经实现各种磁盘调度算法优缺点,尝试实现更多其它磁盘调度算法。

先来先服务算法是一种比较简单磁盘调度算法,它根据进程请求访问磁盘先后次序进行调度,此算法优点是公平、简单,且每个进程请求都能依次得到处理,不会出现某一进程请求长期得不到满足情况,在对磁盘访问请求比较多情况下,致使平均寻道时间可能较长;

最短寻道时间优先算法选择这样进程,其要求访问磁道及当前磁头所在磁道距离最近,以使每次寻道时间最短,该算法可以得到比较好吞吐量,但却不能保证平均寻道时间最短,其缺点是在服务请求很多情况下,对内外边缘磁道请求将会无限期被延迟;

扫描算法不仅考虑到欲访问磁道及当前磁道距离,更优先考虑是磁头当前移动方向,此算法基本上克服了最短寻道时间优先算法服务集中于中间磁道和响应时间变化比较大缺点,而具有最短寻道时间优先算法优点即吞吐量较大,平均响应时间较小,但由于是摆动式扫描方法,两侧磁道被访问频率仍低于中间磁道;

循环扫描算法是对扫描算法改进,如果对磁道访问请求是均匀分布,当磁头到达磁盘一端,并反向运动时落在磁头之后访问请求相对较少;

N-Step-SCAN算法是扫描算法和先来先服务算法一个综合算法,将请求队列分成若干个长度为N子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法,所以它是一种性能比较平均算法。

(6)EOS在块设备层实现了磁盘调度算法后,由于请求队列中请求一定是被逐个处理,所以并发多个线程已经可以互斥访问磁盘上数据,那为什么在IopReadWriteSector函数中还要使用磁盘设备互斥信号量进行互斥呢?

(提示:

如果一个线程只是要获取磁盘设备状态而不是要访问磁盘上数据,是否需要对该线程进行磁盘调度?

该线程是否要及其它并发访问磁盘设备线程进行互斥?

如果一个线程只是要获取磁盘设备状态而不是要访问磁盘上数据,那这个线程是不需要进行磁盘调度,所以不会进入请求队列,但该线程同样需要及其它并发访问磁盘设备线程进行互斥,这时就需要使用磁盘设备互斥信号量进行互斥。

4.源程序并附上注释

BOOLScanInside=TRU

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

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

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