操作系统实验十
- 格式:doc
- 大小:688.00 KB
- 文档页数:19
操作系统 实 验 报 告 课程名称 操作系统实验 课程编号 0906553
实验项目名称 磁盘调度算法 学号 年级 姓名 专业 学生所在学院 指导教师 实验室名称地点
哈尔滨工程大学 计算机科学与技术学院 1
第一讲 磁盘调度算法 一、实验概述 1. 实验名称 磁盘调度算法 2. 实验目的 通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。 编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3. 实验类型 验证,设计 4. 实验内容 4.1 准备实验 4.2 验证先来先服务(FCFS)磁盘调度算法 4.3 验证最短寻道时间优先(SSTF)磁盘调度算法 4.4 验证SSTF算法造成的线程“饥饿”现象 4.5 验证扫描(SCAN)磁盘调度算法 4.6 改写SCAN算法 4.7 编写循环扫描(CSCAN)磁盘调度算法 4.8 验证SSTF、SCAN及CSCAN算法中的“磁臂粘着”现象 4.9 编写N-Step-SCAN磁盘调度算法 二、实验环境 操作系统:Windows XP 编译器:Tevalation OS Lab 语言:C 三、实验过程 1. 设计思路和流程图 SCAN算法流程图: 2
SSTF算法流程图:
CSACN流程图: 3 N-Step-SCAN算法调度:
2. 需要解决的问题及解答 (1)在执行SCAN、N-Step-SCAN 磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考 io/block.c 文件中IopReceiveRequest 函数和 IopProcessNextRequest 函数判断磁盘调度算法开始工作和结束工作的方法)。 答:ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。只需在for循环结束后添加如下代码,就能确保调度的顺序一致。 4
(2)尝试在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。
修改IopProcessNextRequest 函数和ConsoleCmdDiskSchedule 函数,使其不再直接调用IopDiskSchedule 函数而是调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。
调用函数前先声明。
添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc 指向实现了 SSTF 算法的函数。 5
(3)分析已经实现的各种磁盘调度算法的优缺点,尝试实现更多其它的磁盘调度算法。 答:先来先服务算法是一种比较简单的磁盘调度算法,它根据进程请求访问磁盘的先后次序进行调度,此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况,在对磁盘的访问请求比较多的情况下,致使平均寻道时间可能较长;最短寻道时间优先算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短,其缺点是在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟;扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向,此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道;循环扫描算法是对扫描算法的改进,如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少;N-Step-SCAN算法是扫描算法和先来先服务算法的一个综合算法,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法,所以它是一种性能比较平均的算法。 (4)EOS在块设备层实现了磁盘调度算法后,由于请求队列中的请求一定是被逐个处理的,所以并发的多个线程已经可以互斥的访问磁盘上的数据,那为什么在IopReadWriteSector函数中还要使用磁盘设备的互斥信号量进行互斥呢?(提示:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,是否需要对该线程进行磁盘调度?该线程是否要与其它并发访问磁盘设备的线程进行互斥?) 答:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,那这个线程是不需要进行磁盘调度的,所以不会进入请求队列,但该线程同样需要与其它并发访问磁盘设备的线程进行互斥,这时就需要使用磁盘设备的互斥信号量进行互斥。 3. 源程序并附上注释 改写SCAN算法: BOOL ScanInside = TRUE; PREQUEST IopDiskSchedule( VOID ) { PLIST_ENTRY pListEntry; PREQUEST pRequest; 6
LONG Offset; ULONG InsideShortestDistance = 0xFFFFFFFF; ULONG OutsideShortestDistance = 0xFFFFFFFF; PREQUEST pNextRequest; PREQUEST pNextRequestInside = NULL; PREQUEST pNextRequestOutside = NULL; /* 遍历请求队列,计算磁道的偏移,如果 Offset==0 ,则不需要移动; Offset > 0 && Offset < InsideShortestDistance 则向内测移动并计下最短距离; Offset < 0 && -Offset < OutsideShortestDistance 则向外侧移动并计下最短距离。 */ for (pListEntry = RequestListHead.Next; pListEntry != &RequestListHead;pListEntry = pListEntry->Next) { pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry); Offset = pRequest->Cylinder - CurrentCylinder; if (Offset==0) { pNextRequest = pRequest; goto RETURN; } else if (Offset > 0 && Offset < InsideShortestDistance) { InsideShortestDistance = Offset; pNextRequestInside = pRequest; } 7
else if (Offset < 0 && -Offset < OutsideShortestDistance) { OutsideShortestDistance = -Offset; pNextRequestOutside = pRequest; } }; /* 判定移动方向,判定ScanInside是否为0,在判定pNextRequestInside、pNextRequestOutside是否为0,确定移动方向。 */ if (ScanInside) { if(pNextRequestInside != NULL) { pNextRequest = pNextRequestInside; ScanInside = ScanInside; } else { pNextRequest = pNextRequestOutside; ScanInside = !ScanInside; } } else { if(pNextRequestOutside != NULL) { pNextRequest = pNextRequestOutside; ScanInside = ScanInside; } else