第五讲 磁盘调度算法.docx
《第五讲 磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《第五讲 磁盘调度算法.docx(10页珍藏版)》请在冰豆网上搜索。
![第五讲 磁盘调度算法.docx](https://file1.bdocx.com/fileroot1/2023-1/5/ad9dae87-54b8-47da-862d-49305546050c/ad9dae87-54b8-47da-862d-49305546050c1.gif)
第五讲磁盘调度算法
操作系统
实验报告
课程名称
操作系统实验
实验项目名称
磁盘调度算法
学号
2010061304
班级
20100613
姓名
王鸿运
专业
计算机
学生所在学院
计算机科学与技术
指导教师
王红滨
实验室名称地点
计算机基础第七实验室
哈尔滨工程大学
计算机科学与技术学院
一、实验概述
1.实验名称磁盘调度算法
2.实验目的
(1)通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。
(2)观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。
(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3.实验类型验证,设计
4.实验内容
(1)准备实验
(2)验证先来先服务(FCFS)磁盘调度算法
(3)验证最短寻道时间优先(SSTF)磁盘调度算法
(4)验证SSTF算法造成的线程“饥饿”现象
()验证扫描(SCAN)磁盘调度算法
()验证SCAN算法能够解决“饥饿”现象
(6)改写SCAN调度算法
二、实验环境
EOS操作系统与IDE环境组成的“操作系统集成实验环境OSLab”。
三、实验过程
(一)实验问题及解答
1.实验指导验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。
答:
输出结果复制如下:
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
2.实验指导验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。
答:
输出结果复制如下:
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
3.实验指导验证SSTF算法造成的线程“饥饿”现象,要求请给出在“输出”窗口中的结果。
答:
输出结果复制如下:
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
4.实验指导验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》节中的数据)和饥饿(即《实验指导》节中的数据)请给出在“输出”窗口中的结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。
答:
输出结果复制如下:
(1)非饥饿状态,两次输入ds指令
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
(2)饥饿状态,两次输入ds指令
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
分析两次结果为何不同:
执行完一次ds命令后,该次搜索的指针方向被保存,但是和初始值相比,搜索的方向发生了变化。
根据SCAN算法,按一个方向访问磁盘,一个方向访问到尽头后再换一个方向继续访问。
下次访问,按上次访问结束时的方向继续访问。
于是第二次访问的方向会与第一次不同,造成两次DS命令输出的结果不同。
(2)实验代码及解释
实验结果:
制作软盘镜像...
正在启动VirtualPC...
开始调试...
******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
源代码:
PREQUEST
IopDiskSchedule(
VOID
)
{
PLIST_ENTRYpListEntry;
PREQUESTpRequest;
LONGOffset;
ULONGInsideShortestDistance=0xFFFFFFFF;
ULONGOutsideShortestDistance=0xFFFFFFFF;
PREQUESTpNextRequest0=NULL,pNextRequest1=NULL,pNextRequest2=NULL;
//
//需要遍历请求队列一次或两次
//
for(pListEntry=;//请求队列中的第一个请求是链表头指向的下一个请求。
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(OffsetInsideShortestDistance=Offset;
pNextRequest1=pRequest;
}
}if(Offset<0){
//
//记录向外移动距离最短的线程
//
if(-OffsetOutsideShortestDistance=-Offset;
pNextRequest2=pRequest;
}
}
}
if(ScanInside)//判断磁头是否有向内移动。
如果是则执行下面指令
{
if(pNextRequest1)//判断是否有向内移动的线程。
{
returnpNextRequest1;//有则返回向内移动距离最短的线程
}
else
{
ScanInside=!
ScanInside;//改变磁头运动方向向外
returnpNextRequest2;//没有则返回向外移动距离最短的线程
}
}
else//如果否则执行下边的指令
{
if(pNextRequest2)//判断是否有向外移动的线程
{
returnpNextRequest2;//有则返回向外移动距离最短的线程
}
else
{
ScanInside=!
ScanInside;//并改变磁头运动方向向内
returnpNextRequest1;//没有则返回向内移动距离最短的线程
}
}
}
4、实验体会
这是操作系统实验的最后一次实验课,反观这一系列的实验,收获很多。
实际的操作过程中遇到了很多问题,上机实验就是给我们机会去遇到问题,然后让我们去提高解决问题的能力。
编程能力一直是弱点,经过几次试验之后这个短板有所改善,但还是不够,这需要在接下来的学习生活中努力加强。
操作系统这门课我一直很重视,上课听得很认真,实验课也是非常重视,加深对理论的理解并且应用到实际中去。
这一系列的实验我自己感觉,收获很大。