第六讲 磁盘调度算法.docx

上传人:b****7 文档编号:10011342 上传时间:2023-02-07 格式:DOCX 页数:15 大小:118.56KB
下载 相关 举报
第六讲 磁盘调度算法.docx_第1页
第1页 / 共15页
第六讲 磁盘调度算法.docx_第2页
第2页 / 共15页
第六讲 磁盘调度算法.docx_第3页
第3页 / 共15页
第六讲 磁盘调度算法.docx_第4页
第4页 / 共15页
第六讲 磁盘调度算法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

第六讲 磁盘调度算法.docx

《第六讲 磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《第六讲 磁盘调度算法.docx(15页珍藏版)》请在冰豆网上搜索。

第六讲 磁盘调度算法.docx

第六讲磁盘调度算法

操作系统

实验报告

课程名称

操作系统实验

课程编号

0906553

实验项目名称

物理存储器与进程逻辑地址空间的管理

学号

年级

2011

姓名

专业

计算科学与技术

学生所在学院

计算科学与技术

指导教师

实验室名称地点

21B276

哈尔滨工程大学

计算机科学与技术学院

第六讲磁盘调度算法

一、实验概述

1.实验名称

磁盘调度算法

2.实验目的

●通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。

●观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。

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

3.实验类型

验证+设计

4.实验内容

1准备实验

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

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

4验证SSTF算法造成的线程“饥饿”现象

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

6改写SCAN算法

二、实验环境

EOS操作系统和OSLab集成实验环境。

三、实验过程

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:

10

TID:

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

******Diskschedulestopworking******

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

使用OSLab打开本实验文件夹中的sstf.c文件(将sstf.c文件拖动到OSLab窗口中释放即可)。

该文件提供的IopDiskSchedule函数实现了SSTF磁盘调度算法。

在阅读此函数的源代码的时,可以参考图18-3所示的流程图,并且应该特别注意下面几点:

●变量Offset是有符号的长整型,用来表示磁头的偏移(包括距离和方向)。

Offset大于0时表示磁头向内移动(磁道号增加);小于0时表示磁头向外移动(磁道号减少);等于0时表示磁头没有移动。

而名称以“Distance”结尾的变量都是无符号长整型,只表示磁头移动的距离(无方向)。

所以在比较磁头的偏移和距离时,或者在将偏移赋值给距离时,都要取偏移的绝对值(调用C库函数abs)。

本实验在实现其它磁盘调度算法时也同样遵守此约定。

●在开始遍历之前,将最小距离(ShortestDistance)初始化为最大的无符号长整型数,这样,第一次计算的距离一定会小于最小距离,从而可以使用第一次计算的距离来再次初始化最小距离。

本实验在实现其它磁盘调度算法时也同样使用了此技巧。

按照下面的步骤进行验证:

1.使用sstf.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。

2.按F7生成项目,然后按F5启动调试。

3.待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。

对比EOS控制台和“输出”窗口中的内容(特别是线程ID的顺序),可以发现,SSTF算法唤醒线程的顺序与线程被阻塞的顺序是不同的。

图18-4显示了本次调度执行时磁头移动的轨迹。

对比SSTF算法与FCFS算法在“输出”窗口中的内容,可以看出,SSTF算法的平均寻道数明显低于FCFS算法。

但是,SSTF算法能保证平均寻道数最少吗?

在后面的实验中会进行验证。

可以在控制台中多次输入“ds”命令,查看磁盘调度算法执行况。

将“输出”窗口中的内容复制到一个文本文件中,然后结束此次调试。

 

SSTF磁盘调度算法,输出结果:

******Diskschedulestartworking******

StartCylinder:

10

TID:

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算法造成的线程“饥饿”现象

1.修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、21、9、8、11、41、10、67、12、10。

2.按F7生成项目,然后按F5启动调试。

3.待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。

4.查看“输出”窗口中显示的内容,可以发现,虽然访问78号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“饥饿”现象。

如果不断有新线程的请求到达并被优先满足,则访问78号磁道的线程的“饥饿”情况就会更加严重。

SSTF算法造成的线程“饥饿”现象,输出结果:

******Diskschedulestartworking******

StartCylinder:

10

TID:

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算法调度在本实验3.4中产生“饥饿”现象的数据,验证SCAN算法能够解决“饥饿”现象,并将“输出”窗口中的内容保存到一个文本文件中。

最后将ConsoleCmdDiskSchedule函数中线程访问的磁道号恢复到本实验3.2中的样子,在后面的实验中还要使用这些数据。

3.4数据,输出结果:

******Diskschedulestartworking******

StartCylinder:

10

TID:

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******

 

******Diskschedulestartworking******

StartCylinder:

10

TID:

47Cylinder:

10Offset:

0=

TID:

50Cylinder:

10Offset:

0=

TID:

43Cylinder:

9Offset:

1-

TID:

44Cylinder:

8Offset:

1-

TID:

45Cylinder:

11Offset:

3+

TID:

49Cylinder:

12Offset:

1+

TID:

42Cylinder:

21Offset:

9+

TID:

46Cylinder:

41Offset:

20+

TID:

48Cylinder:

67Offset:

26+

TID:

41Cylinder:

78Offset:

11+

Totaloffset:

72Transfertimes:

10Averageoffset:

7

******Diskschedulestopworking******

3.2数据,输出结果:

******Diskschedulestartworking******

StartCylinder:

10

TID:

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:

146Transfertimes:

10Averageoffset:

14

******Diskschedulestopworking******

 

******Diskschedulestartworking******

StartCylinder:

10

TID:

47Cylinder:

10Offset:

0=

TID:

50Cylinder:

10Offset:

0=

TID:

43Cylinder:

9Offset:

1-

TID:

41Cylinder:

8Offset:

1-

TID:

45Cylinder:

0Offset:

8-

TID:

49Cylinder:

12Offset:

12+

TID:

42Cylinder:

21Offset:

9+

TID:

46Cylinder:

41Offset:

20+

TID:

48Cylinder:

67Offset:

26+

TID:

44Cylinder:

78Offset:

11+

Totaloffset:

88Transfertimes:

10Averageoffset:

8

******Diskschedulestopworking******

5)改写SCAN算法

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

由于线程和请求总是一一对应的,为了使后面的内容更加简单易懂,有时就不再区分这两个概念。

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

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

偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求。

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

具体逻辑可以参见图18-6所示的流程图。

IopDiskSchedule(VOID)

/*++

功能描述:

磁盘调度。

可以在本函数中实现多种磁盘调度算法

(包括FCFS、SSTF、SCAN、CSCAN、N-Step-SCAN等)。

参数:

无。

返回值:

返回从请求队列中选择的下一个要被处理的请求的指针。

说明:

多数磁盘调度算法都是根据当前磁头所在的磁道和各个线程要访问的磁道来进行调度的。

其中当前磁头所在的磁道保存在全局变量CurrentCylinder中,而请求队列中各个请求的Cylinder域保存了对应线程要访问的磁道。

注意,该函数只是从请求队列中选择下一个要被处理的请求,而不需要将选中

的请求从请求队列中移除,也不需要将请求对应的线程唤醒。

--*/

{

PLIST_ENTRYpListEntry;

PREQUESTpRequest;

LONGOffset;

ULONGInsideShortestDistance=0xFFFFFFFF;

ULONGOutsideShortestDistance=0xFFFFFFFF;

PREQUESTpNextRequest;

PREQUESTpNextRequestInside=NULL;

PREQUESTpNextRequestOutside=NULL;

/*遍历请求队列,计算磁道的偏移,如果Offset==0,则不需要移动;

Offset>0&&Offset

Offset<0&&-Offset

*/

for(pListEntry=RequestListHead.Next;pListEntry!

=&RequestListHead;pListEntry=pListEntry->Next)

{

pRequest=CONTAINING_RECORD(pListEntry,REQUEST,ListEntry);

Offset=pRequest->Cylinder-CurrentCylinder;

if(Offset==0)

{

pNextRequest=pRequest;

gotoRETURN;

}

elseif(Offset>0&&Offset

{

InsideShortestDistance=Offset;

pNextRequestInside=pRequest;

}

elseif(Offset<0&&-Offset

{

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

{

pNextRequest=pNextRequestInside;

ScanInside=!

ScanInside;

}

}

RETURN:

returnpNextRequest;

}

输出结果:

******Diskschedulestartworking******

StartCylinder:

10

TID:

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:

146Transfertimes:

10Averageoffset:

14

******Diskschedulestopworking******

 

******Diskschedulestartworking******

StartCylinder:

10

TID:

47Cylinder:

10Offset:

0=

TID:

50Cylinder:

10Offset:

0=

TID:

43Cylinder:

9Offset:

1-

TID:

41Cylinder:

8Offset:

1-

TID:

45Cylinder:

0Offset:

8-

TID:

49Cylinder:

12Offset:

12+

TID:

42Cylinder:

21Offset:

9+

TID:

46Cylinder:

41Offset:

20+

TID:

48Cylinder:

67Offset:

26+

TID:

44Cylinder:

78Offset:

11+

Totaloffset:

88Transfertimes:

10Averageoffset:

8

******Diskschedulestopworking******

分析结果为什么不同:

(以3.2的数据为例进行说明)

第一次“ds”执行完以后,磁头停在0处,第二次开始执行“ds”时,磁头从0移动到调度算法的初始化位置10(向内移动),结束向内移动扫描,扫描到10,然后磁头向相反方,向外移动扫描扫描9、8、0,扫描到0时向外扫描结束,向相反方向扫描12、21、41、67、78结束。

四、实验体会

通过这实验对磁盘调度算法更加了解,掌握了磁盘调度算法执行的条件和时机。

不过每次试验不可能一帆风顺的,而且是很容易出错,每次出错就让人很烦恼,很可能漏掉了什么步骤,这意味著要重新开始,所以这是很难受的事情。

因此我觉得做实验不要盲目的去追求快,而是一边做一边思考其中的意义,争取一次性做好。

遇到问题有时候向网络需求帮助也是一个不错的选择,但是不能一味的抄袭复制,那样就失去做实验的目的,而应该借鉴别人东西的同时要思考为什么会这样子用,这样子做,我为什么错了。

搞清楚问题的所在,才能算是真正的解决了问题。

总之,每次实验有一点收获就是一种进步,只要保持每天进步一点,最终积累的知识就很多了,从而实现自我提升。

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

当前位置:首页 > 自然科学 > 天文地理

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

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