操作系统实验 磁盘调度算法Word格式.docx
《操作系统实验 磁盘调度算法Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验 磁盘调度算法Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
王红滨
实验室名称地点
软件工程实验室21B282
哈尔滨工程大学
第五讲磁盘调度算法
一、实验概述
1.实验名称
磁盘调度算法
2.实验目的
(1)通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。
(2)观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。
(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3.实验类型(验证、设计)
验证+设计
4.实验内容
(1)准备实验
(2)验证先来先服务(FCFS)磁盘调度算法
(3)验证最短寻道时间优先(SSTF)磁盘调度算法
(4)验证SSTF算法造成的线程“饥饿”现象
(5)1.验证扫描(SCAN)磁盘调度算法
2.验证SCAN算法能够解决“饥饿”现象
(6)改写SCAN调度算法
2、实验环境
操作系统:
Windowsxp
实验环境:
Oslab;
编程语言:
C++
三、实验过程
1.源程序并附上注释
PREQUEST
IopDiskSchedule(
VOID
)
{
PLIST_ENTRYpListEntry;
PREQUESTpRequest;
LONGOffset;
ULONGInsideShortestDistance=0xFFFFFFFF;
ULONGOutsideShortestDistance=0xFFFFFFFF;
PREQUESTpNextRequest0=NULL,pNextRequest1=NULL,pNextRequest2=NULL;
////
//
//需要遍历请求队列一次或两次
for(pListEntry=RequestListHead.Next;
//请求队列中的第一个请求是链表头指向的下一个请求。
pListEntry!
=&
RequestListHead;
//遍历到请求队列头时结束循环。
pListEntry=pListEntry->
Next){
//
//根据链表项获得请求的指针
pRequest=CONTAINING_RECORD(pListEntry,REQUEST,ListEntry);
//计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移
Offset=pRequest->
Cylinder-CurrentCylinder;
if(0==Offset){
//
//如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。
pNextRequest0=pRequest;
returnpNextRequest0;
}if(Offset>
0){
//记录向内移动距离最短的线程
if(Offset<
InsideShortestDistance){///偏移小于向内最短距离
InsideShortestDistance=Offset;
pNextRequest1=pRequest;
}
}if(Offset<
//记录向外移动距离最短的线程
if(-Offset<
OutsideShortestDistance){
OutsideShortestDistance=-Offset;
pNextRequest2=pRequest;
}
}
if(ScanInside)//判断磁头是否有向内移动。
如果是则执行下面指令
{
if(pNextRequest1)//判断是否有向内移动的线程。
{
returnpNextRequest1;
//有则返回向内移动距离最短的线程
else
ScanInside=!
ScanInside;
//改变磁头运动方向向外
returnpNextRequest2;
//没有则返回向外移动距离最短的线程
}
else//如果否则执行下边的指令
if(pNextRequest2)//判断是否有向外移动的线程
{
returnpNextRequest2;
//有则返回向外移动距离最短的线程
else
ScanInside=!
//并改变磁头运动方向向内
returnpNextRequest1;
//没有则返回向内移动距离最短的线程
}
2.程序运行时的初值和运行结果:
(1)验证先来先服务(FCFS)磁盘调度算法
(2)验证最短寻道时间优先(SSTF)磁盘调度算法
(3)验证SSTF算法造成的线程“饥饿”现象
(4)验证扫描(SCAN)磁盘调度算法
//先来先服务的磁柱调度算法
******Diskschedulestartworking******
StartCylinder:
10
TID:
31Cylinder:
8Offset:
2-
32Cylinder:
21Offset:
13+
33Cylinder:
9Offset:
12-
34Cylinder:
78Offset:
69+
35Cylinder:
0Offset:
78-
36Cylinder:
41Offset:
41+
37Cylinder:
10Offset:
31-
38Cylinder:
67Offset:
57+
39Cylinder:
12Offset:
55-
40Cylinder:
Totaloffset:
360Transfertimes:
10Averageoffset:
36
******Diskschedulestopworking******
//磁柱顺序未改变电梯调度结果
0=
2+
9+
20+
26+
11+
69-
1-
8-
146Transfertimes:
14
******Diskschedulestopworking*******
//磁柱顺序未改变最邻近优先调度结果
4+
150Transfertimes:
15
//磁柱顺序改变后最邻近优先调度结果,78排在队列首,却在最后被调度,孩子被饿到了
11Offset:
3+
1+
72Transfertimes:
7
//验证电梯调度解决最邻近优先的饥饿,78在调度队列首
138Transfertimes:
13
四、实验体会
通过本次实验,了解了磁盘调度的算法,直观的观察了FCFS、SSTF、SCAN算法的结果。
从根本上理解了饥饿现象,把以前只是理论的知识运用到实验中,理解的更深刻。