第十讲 磁盘调度算法_第1页
第十讲 磁盘调度算法_第2页
第十讲 磁盘调度算法_第3页
第十讲 磁盘调度算法_第4页
第十讲 磁盘调度算法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统实验报告课程名称操作系统实验实验项目名称磁盘调度算法学号班级姓名专业计算机科学与技术学生所在学院计算机学院指导教师实验室名称地点计算机基础实验第七实验室哈尔滨工程大学计算机科学与技术学院一、实验概述1.实验名称磁盘调度算法2.实验目的=1\*ROMANI.通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。=2\*ROMANII.观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。=3\*ROMANIII.编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。3.实验类型(验证、设计)验证+设计4.实验内容1.准备实验2.验证先来先服务(FCFS)磁盘调度算法2.1在“项目管理器”窗口中双击ke文件夹中的sysproc.c文件,打开此文件。2.2在sysproc.c文件的第580行找到控制台命令“ds”对应的函数ConsoleCmdDiskSchedule。2.3打开io/block.c文件,在第378行找到磁盘调度算法函数IopDiskSchedule。2.4按F7生成项目,然后按F5启动调试。3.验证最短寻道时间优先(SSTF)磁盘调度算法3.1使用sstf.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。3.2按F7生成项目,然后按F5启动调试。3.3待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。4.验SSTF算法造成的线程“饥饿”现象4.1修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、21、9、8、11、41、10、67、12、10。4.2按F7生成项目,然后按F5启动调试。4.3待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。5.验证扫描(SCAN)磁盘调度算法6.改写SCAN算法二、实验环境操作系统:EOS操作系统编译器:IDE集成实验环境语言:C语言三、实验过程(1)验证先来先服务(FCFS)磁盘调度算法1.在“项目管理器”窗口中双击ke文件夹中的sysproc.c文件,打开此文件。2.在sysproc.c文件的第580行找到控制台命令“ds”对应的函数ConsoleCmdDiskSchedule。“ds”命令专门用来测试磁盘调度算法。阅读该函数中的源代码,目前该函数使磁头初始停留在磁道10,其它被阻塞的线程依次访问磁道8、21、9、78、0、41、10、67、12、10。3.打开io/block.c文件,在第378行找到磁盘调度算法函数IopDiskSchedule。阅读该函数中的源代码,目前此函数实现了FCFS磁盘调度算法,其流程图可以参见图18-1。4.按F7生成项目,然后按F5启动调试。5.待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。FCFS磁盘调度算法,“输出”结果:******Diskschedulestartworking******StartCylinder:10TID:31Cylinder:8Offset:2-TID:32Cylinder:21Offset:13+TID:33Cylinder:9Offset:12-TID:34Cylinder:78Offset:69+TID:35Cylinder:0Offset:78-TID:36Cylinder:41Offset:41+TID:37Cylinder:10Offset:31-TID:38Cylinder:67Offset:57+TID:39Cylinder:12Offset:55-TID:40Cylinder:10Offset:2-Totaloffset:360Transfertimes:10Averageoffset:36(2)验证最短寻道时间优先(SSTF)磁盘调度算法1.使用sstf.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。2.按F7生成项目,然后按F5启动调试。3.待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。4.对比EOS控制台和“输出”窗口中的内容(特别是线程ID的顺序),可以发现,SSTF算法唤醒线程的顺序与线程被阻塞的顺序是不同的。图18-4显示了本次调度执行时磁头移动的轨迹。对比SSTF算法与FCFS算法在“输出”窗口中的内容,可以看出,SSTF算法的平均寻道数明显低于FCFS算法。SSTF磁盘调度算法,“输出”结果:******Diskschedulestartworking******StartCylinder:10TID:37Cylinder:10Offset:0=TID:40Cylinder:10Offset:0=TID:33Cylinder:9Offset:1-TID:31Cylinder:8Offset:1-TID:39Cylinder:12Offset:4+TID:32Cylinder:21Offset:9+TID:36Cylinder:41Offset:20+TID:38Cylinder:67Offset:26+TID:34Cylinder:78Offset:11+TID:35Cylinder:0Offset:78-Totaloffset:150Transfertimes:10Averageoffset:15******Diskschedulestopworking******(3)验证SSTF算法造成的线程“饥饿”现象修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、21、9、8、11、41、10、67、12、10。按F7生成项目,然后按F5启动调试。待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。查看“输出”窗口中显示的内容,可以发现,虽然访问78号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“饥饿”现象。如果不断有新线程的请求到达并被优先满足,则访问78号磁道的线程的“饥饿”情况就会更加严重。SSTF算法造成的线程“饥饿”现象,“输出”结果:******Diskschedulestartworking******StartCylinder:10TID:37Cylinder:10Offset:0=TID:40Cylinder:10Offset:0=TID:33Cylinder:9Offset:1-TID:34Cylinder:8Offset:1-TID:35Cylinder:11Offset:3+TID:39Cylinder:12Offset:1+TID:32Cylinder:21Offset:9+TID:36Cylinder:41Offset:20+TID:38Cylinder:67Offset:26+TID:31Cylinder:78Offset:11+Totaloffset:72Transfertimes:10Averageoffset:7******Diskschedulestopworking******(4)验证扫描(SCAN)磁盘调度算法1.使用scan.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。2.按F7生成项目,然后按F5启动调试。3.待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。4.对比SCAN算法与SSTF算法在“输出”窗口中的内容,可以看出,SCAN算法的平均寻道数有可能小于SSTF算法,所以说SSTF算法不能保证平均寻道数最少。验证电梯调度解决最邻近优先的饥饿,78在调度队列首:******Diskschedulestartworking******StartCylinder:10TID:37Cylinder:10Offset:0=TID:40Cylinder:10Offset:0=TID:35Cylinder:11Offset:1+TID:39Cylinder:12Offset:1+TID:32Cylinder:21Offset:9+TID:36Cylinder:41Offset:20+TID:38Cylinder:67Offset:26+TID:31Cylinder:78Offset:11+TID:33Cylinder:9Offset:69-TID:34Cylinder:8Offset:1-Totaloffset:138Transfertimes:10Averageoffset:13******Diskschedulestopworking******(5)改写SCAN算法在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次。在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求。循环结束后,根据当前磁头移动的方向选择同方向移动距离最短的线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短的线程。具体逻辑可以参见图18-6所示的流程图。源代码PLIST_ENTRYpListEntry; PREQUESTpRequest; LONGOffset; ULONGInsideShortestDistance=0xFFFFFFFF; ULONGOutsideShortestDistance=0xFFFFFFFF;//设置两个指针变量 PREQUESTpNextRequest_1=NULL;PREQUESTpNextRequest_2=NULL; PREQUESTpNextRequest=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; returnpNextRequest; } if(Offset>0) { if(Offset<InsideShortestDistance) { InsideShortestDistance=Offset;//记录向内移动距离最短的线程 pNextRequest_1=pRequest; } } if(Offset<0) { if(-Offset<OutsideShortestDistance) { OutsideShortestDistance=-Offset;//记录向外移动距离最短的线程 pNextRequest_2=pRequest; } } } //循环结束后同时记录了两个方向上移动距离最短的线程if(ScanInside)//是否有向内的线程 {if(pNextRequest_1)returnpNextRequest_1;//返回向内移动距离最短的线程 else {ScanInside=!ScanInside;returnpNextRequest_2;//选择向外移动距离最短的线程 } }else//有向外的线程 {if(pNextRequest_2) returnpNextRequest_2;//选择向外移动距离最短的线程 else {ScanInside=!ScanInside;returnpNextRequest_1;//选择向内移动距离最短的线程 } } 输出结果:******Diskschedulestartworking******StartCylinder:10TID:37Cylinder:10Offset:0=TID:40Cylinder:10Offset:0=TID:39Cylinder:12Offset:2+TID:32Cylinder:21Offset:9+TID:36Cylinder:41Offset:20+TID:38Cylinder:67Offset:26+TID:34Cylinder:78Offset:11+TID:33Cylinder:9Offset:69-TID:31Cylinder:8Offset:1-TID:35Cylinder:0Offset:8-Totaloffset:14

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论