搜档网
当前位置:搜档网 › 操作系统实验第五讲磁盘调度算法

操作系统实验第五讲磁盘调度算法

操作系统实验第五讲磁盘调度算法
操作系统实验第五讲磁盘调度算法

操作系统

实验报告

哈尔滨工程大学

计算机科学与技术学院

第六讲磁盘调度算法

一、实验概述

1. 实验名称

磁盘调度算法

2. 实验目的

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

(2)观察EOS 实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法;

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

3. 实验类型

验证性+设计性实验

4. 实验内容

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

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

(3)验证SSTF算法造成的线程“饥饿”现象;

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

(5)改写SCAN算法。

二、实验环境

在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。

三、实验过程

1. 设计思路和流程图

(1)改写SCAN算法

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

图 3.1.1 SCAN算法IopDiskSchedule函数流程图

(2)编写循环扫描(CSCAN)磁盘调度算法

在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。算法流程图如下图所示。

图 3.1.2 CSCAN算法IopDiskSchedule函数流程图

(3)编写N-Step-SCAN磁盘调度算法

在已经完成的SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。算法流程图如下图所示。

图 3.1.3 N-Step-SCAN算法IopDiskSchedule函数流程图

2.算法实现

(1)改写SCAN算法

在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次。在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,可以将偏移分为三种类型:偏移为0,

表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求。循环结束后,根据当前磁头移动的方向选择同方向移动距离最短的线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短的线程。

(2)编写循环扫描(CSCAN)磁盘调度算法

由于规定了磁头只能从外向内移动,所以在每次遍历中,总是同时找到向内移动距离最短的线程和向外移动距离最长的线程。注意,与SCAN 算法查找向外移动距离最短线程不同,这里查找向外移动距离最长的线程。在开始遍历前,可以将用来记录向外移动最长距离的变量赋值为0。在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,同样可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最长的线程对应的请求。循环结束后,选择向内移动距离最短的线程,如果没有向内移动的线程,就选择向外移动距离最长的线程。

(3)编写N-Step-SCAN磁盘调度算法

在block.c 文件中的第360 行定义了一个宏SUB_QUEUE_LENGTH,表示子队列的长度(即N 值)。目前这个宏定义的值为6。在第367行定义了一个全局变量SubQueueRemainLength,表示第一个子队列剩余的长度,并初始化其值为

SUB_QUEUE_LENGTH。在执行N-Step-SCAN算法时,要以第一个子队列剩余的长度做为计数器,确保只遍历第一个子队列剩余的项。所以,结束遍历的条件就既包括第一个子队列结束,又包括整个队列结束(如果整个队列的长度小于第一个子队列剩余的长度)。注意,不要直接使用第一个子队列剩余的长度做为计数器,可以定义一个新的局部变量来做为计数器。按照SCAN 算法从第一个子队列剩余的项中选择一个合适的请求。最后,需要将第一个子队列剩余长度减少1(SubQueueRemainLength减少1),如果

第一个子队列剩余长度变为0,说明第一个子队列处理完毕,需要将子队列剩余的长度重新变为N(SubQueueRemainLength 重新赋值为SUB_QUEUE_LENGTH),从而开始处理下一个子队列。

3.需要解决的问题及解答

(1)实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。

答:先来先服务(FCFS)磁盘调度算法在“输出”窗口中的结果如下图所示。

图 3.3.1

(2)实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。

答:最短寻道时间优先(SSTF)磁盘调度算法在“输出”窗口中的结果如下图所示。

图 3.3.2

(3)实验指导P178-3.4验证SSTF算法造成的线程“饥饿”现象,要求请给出在“输出”窗口中的结果。

答:SSTF算法造成的线程“饥饿”现象在“输出”窗口中的结果如下图所示。

图 3.3.3

(4)实验指导P179-3.5验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》P176-3.2节中的数据)和饥饿(即《实验指导》P178-3.4节中的数据)请给出在“输出”窗口中的结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。

答:在非饥饿情况下,“输出”窗口中的结果如下图所示。

图 3.3.4

在饥饿情况下,“输出”窗口中的结果如下图所示。

图 3.3.5

ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。

(5)在执行SCAN、N-Step-SCAN 磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考io/block.c 文件中IopReceiveRequest 函数和IopProcessNextRequest 函数判断磁盘调度算法开始工作和结束工作的方法)。

答:ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。只需在for循环结束后添加如下代码,就能确保调度的顺序一致。

图 3.3.6

(6)尝试在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。

图 3.3.7

修改IopProcessNextRequest 函数和ConsoleCmdDiskSchedule 函数,使其不再直接调用IopDiskSchedule 函数而是调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。

图 3.3.8

调用函数前先声明。

图 3.3.9

添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc 指向实现了SSTF 算法的函数。

验证结果如下图所示。

(7)分析已经实现的各种磁盘调度算法的优缺点,尝试实现更多其它的磁盘调度算法。

答:先来先服务算法是一种比较简单的磁盘调度算法,它根据进程请求访问磁盘的先后次序进行调度,此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况,在对磁盘的访问请求比较多的情况下,致使平均寻道时间可能较长;最短寻道时间优先算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短,其缺点是在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟;扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向,此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道;循环扫描算法是对扫描算法的改进,如果对磁道

的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少;N-Step-SCAN算法是扫描算法和先来先服务算法的一个综合算法,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法,所以它是一种性能比较平均的算法。

(6)EOS 在块设备层实现了磁盘调度算法后,由于请求队列中的请求一定是被逐个处理的,所以并发的多个线程已经可以互斥的访问磁盘上的数据,那为什么在IopReadWriteSector 函数中还要使用磁盘设备的互斥信号量进行互斥呢?(提示:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,是否需要对该线程进行磁盘调度?该线程是否要与其它并发访问磁盘设备的线程进行互斥?)答:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,那这个线程是不需要进行磁盘调度的,所以不会进入请求队列,但该线程同样需要与其它并发访问磁盘设备的线程进行互斥,这时就需要使用磁盘设备的互斥信号量进行互斥。

4.源程序并附上注释

(1)改写SCAN算法

BOOL ScanInside = TRUE;

PREQUEST

IopDiskSchedule(

VOID

)

{

PLIST_ENTRY pListEntry;

PREQUEST pRequest;

PREQUEST INpNextRequest = NULL;

PREQUEST OUTpNextRequest = NULL;

LONG Offset;

ULONG InsideShortestDistance = 0xFFFFFFFF;

ULONG OutsideShortestDistance = 0xFFFFFFFF;

PREQUEST pNextRequest = 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;

goto RETURN;

} else if ( Offset > 0 && Offset < InsideShortestDistance ) {

// 记录向内移动距离最短的线程

InsideShortestDistance = Offset;

INpNextRequest = pRequest;

} else if ( Offset < 0 && -Offset < OutsideShortestDistance ) {

// 记录向外移动距离最短的线程

OutsideShortestDistance = -Offset;

OUTpNextRequest = pRequest;

}

}

//判断磁头移动方向,若向内移动

if( ScanInside)

{

//判断是否有向内移动的线程

if(INpNextRequest)

{

//有则选择该线程

return INpNextRequest;

}

else

{

//没有则修改磁头方向,选择向外移动距离最短的线程

ScanInside = !ScanInside;

return OUTpNextRequest;

}

}

//如果向外移动

else

{

//判断是否有向外移动的线程

if(OUTpNextRequest)

{

//有则选择该线程

return OUTpNextRequest;

}

else

{

//没有则修改词头方向,选择向内移动距离最短的线程

ScanInside = !ScanInside;

return INpNextRequest;

}

}

RETURN:

return pNextRequest;

}

(2)编写循环扫描(CSCAN)磁盘调度算法

PREQUEST

IopDiskSchedule(

VOID

)

{

PLIST_ENTRY pListEntry;

PREQUEST pRequest;

PREQUEST INpNextRequest = NULL;

PREQUEST OUTpNextRequest = NULL;

LONG Offset;

ULONG InsideShortestDistance = 0xFFFFFFFF;

ULONG OutsideShortestDistance = 0x00000000;

PREQUEST pNextRequest = 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;

goto RETURN;

} else if ( Offset > 0 && Offset < InsideShortestDistance ) {

// 记录向内移动距离最短的线程

InsideShortestDistance = Offset;

INpNextRequest = pRequest;

} else if ( Offset < 0 && -Offset > OutsideShortestDistance ) {

// 记录向外移动距离最长的线程

OutsideShortestDistance = -Offset;

OUTpNextRequest = pRequest;

}

}

//需要向内移动的线程是否存在

if( INpNextRequest )

{

//存在则返回向内移动的请求

return INpNextRequest;

}

else

{

//否则返回向外移动的请求

return OUTpNextRequest;

}

RETURN:

return pNextRequest;

}

(3)编写N-Step-SCAN磁盘调度算法

// N-Step-SCAN 磁盘调度算法使用的子队列长度N

#define SUB_QUEUE_LENGTH 6

// 记录N-Step-SCAN 磁盘调度算法第一个子队列剩余的长度。

// 子队列初始长度为N,每执行一次磁盘调度算法会从子队列中移除一个请求,子队列

// 长度就要减少1,待长度变为0 时,再将长度重新变为N,开始处理下一个子队列。

ULONG SubQueueRemainLength = SUB_QUEUE_LENGTH;

// 扫描算法中磁头移动的方向。操作系统启动时初始化为磁头向内移动。

// TRUE,磁头向内移动,磁道号增加。

// FALSE,磁头向外移动,磁道号减少。

BOOL ScanInside = TRUE;

PREQUEST

IopDiskSchedule(

VOID

)

{

PLIST_ENTRY pListEntry;

PREQUEST pRequest;

PREQUEST INpNextRequest = NULL;

PREQUEST OUTpNextRequest = NULL;

LONG Offset;

ULONG InsideShortestDistance = 0xFFFFFFFF;

ULONG OutsideShortestDistance = 0xFFFFFFFF;

PREQUEST pNextRequest = NULL;

ULONG counter;

//

// 需要遍历请求队列一次或两次

//

//计数器记录一个子队列剩余的长度

counter = SubQueueRemainLength;

//没调度一次子队列剩余的长度减

SubQueueRemainLength--;

//如果子队列剩余的长度为,则重置为子队列原长度

if(SubQueueRemainLength == 0)

SubQueueRemainLength = SUB_QUEUE_LENGTH;

for (pListEntry = RequestListHead.Next; // 请求队列中的第一个请求是链表头指//向的下一个

请求。

pListEntry != &RequestListHead && counter>0; // 遍历到请求队列头时结//束循环或子

队列结束。

pListEntry = pListEntry->Next) {

// 根据链表项获得请求的指针

pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);

// 计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移(方向由正负表示)Offset = pRequest->Cylinder - CurrentCylinder;

if (0 == Offset) {

// 如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。

pNextRequest = pRequest;

return pNextRequest;

} else if ( Offset > 0 && Offset < InsideShortestDistance ) {

// 记录向内移动距离最短的线程

InsideShortestDistance = Offset;

INpNextRequest = pRequest;

} else if ( Offset < 0 && -Offset < OutsideShortestDistance ) {

// 记录向外移动距离最短的线程

OutsideShortestDistance = -Offset;

OUTpNextRequest = pRequest;

}

counter--;

}

if( ScanInside )

{

if(INpNextRequest)

{

return INpNextRequest;

}

else

{

ScanInside = !ScanInside;

return OUTpNextRequest;

}

}

else

{

if(OUTpNextRequest)

{

return OUTpNextRequest;

}

else

{

ScanInside = !ScanInside;

return INpNextRequest;

}

}

}

5. 程序运行时的初值和运行结果

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

新建一个EOS Kernel项目,双击ke文件夹中的sysproc.c文件,阅读函数ConsoleCmdDiskSchedule,目前该函数使磁头初始停留在磁道10,其它被阻塞的线程依次访问磁道8、21、9、78、0、41、10、67、12、10。

按F5调试项目,待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。控制台和输出窗口显示内容如下图所示。

图 3.5.2

图 3.5.3

对比EOS控制台和“输出”窗口中的内容,可以发现FCFS算法是根据线程访问磁盘的先后顺序进行调度的。

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

使用sstf.c 文件中IopDiskSchedule 函数的函数体,替换block.c 文件中IopDiskSchedule 函数的函数体。按F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。输出窗口输出结果如下图所示。

图 3.5.4

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

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

F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。输出窗口输出结果如下图所示。

图 3.5.5

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

使用scan.c 文件中IopDiskSchedule 函数的函数体,替换block.c 文件中IopDiskSchedule 函数的函数体。按F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS控制台中输入命令“ds”后按回车。输出窗口输出内容如下图所示。

图 3.5.6

再次输入“ds”命令,输出窗口输出内容如下图所示。

图 3.5.7

(5)改写SCAN算法

修改完代码后,按F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS 控制台中输入命令“ds”后按回车。输出窗口输出内容如下图所示。

图 3.5.8

调试结果与预期一致,说明算法改写正确。

图 3.5.9

(6)编写循环扫描(CSCAN)磁盘调度算法

修改完代码后,按F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS 控制台中输入命令“ds”后按回车。输出窗口输出内容如下图所示。

调试结果与预期一致,说明算法改写正确

(7)验证SSTF、SCAN 及CSCAN算法中的“磁臂粘着”现象

修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、10、10、10、10、10、10、10、10、10。分别使用SSTF、SCAN 和CSCAN算法调度这组数据。输出窗口输出内容如下图所示。

SSTF“磁臂粘着”现象:

SCAN“磁臂粘着”现象:

CSCAN“磁臂粘着”现象:

(8)编写N-Step-SCAN磁盘调度算法

修改完代码后,按F7生成项目,然后按F5 启动调试。待EOS启动完毕,在EOS 控制台中输入命令“ds”后按回车。输出窗口输出内容如下图所示。

调试结果与预期一致,说明算法改写正确。

SUB_QUEUE_LENGTH=100时

SUB_QUEUE_LENGTH=1时

使用本实验 3.8 中的数据验证 N-Step-SCAN 算法可以避免“磁臂粘着”现象,运行结果如图:

四、实验体会

通过学习EOS实现磁盘调度算法,对磁盘调度算法执行的过程有了一定的认识。同时通过实验操作观察了EOS实现的FCFS、SSTF和SCAN磁盘调度算法,通过设计SCAN、CSCAN和N-STEP-SCAN算法,让我对各个算法的执行过程有了清楚的认识。通过本学期的操作系统实验学习让我对操作系统的知识有了更切实的了解,也让自己的编程能力有所锻炼。

操作系统磁盘调度算法实验报告

《操作系统原理》 课程设计报告书 题目:磁盘调度 专业:网络工程 学号: 学生姓名: 指导教师: 完成日期:

目录 第一章课程设计目的 (1) 1.1编写目的 (1) 第二章课程设计内容 (2) 2.1设计内容 (2) 2.1.1、先来先服务算法(FCFS) (2) 2.1.2、最短寻道时间优先算法(SSTF) (2) 2.1.3、扫描算法(SCAN) (3) 2.1.4、循环扫描算法(CSCAN) (3) 第三章系统概要设计 (4) 3.1模块调度关系图 (4) 3.2模块程序流程图 (4) 3.2.1 FCFS算法 (5) 3.2.2 SSTF算法 (6) 3.2.3 SCAN算法 (7) 3.2.4 CSCAN算法 (8) 第四章程序实现 (9) 4.1 主函数的代码实现 (9) 4.2.FCFS算法的代码实现 (11) 4.3 SSTF算法的代码实现 (13) 4.4 SCAN算法的代码实现 (15) 4.5 CSCAN算法的代码实现 (17) 第五章测试数据和结果 (20) 第六章总结 (23)

第一章课程设计目的 1.1编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解 1

第二章课程设计内容 2.1设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 2.1.1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2.1.2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 2

操作系统实验报告模板

操作系统上机 实验报告 成绩 教师: 2012 年 12月 5日 班级: 学号: 姓名: 实验地点: 实验时间:

实验一进程的建立 【实验目的】 创建进程及子进程 在父子进程间实现进程通信 【实验软硬件环境】 Linux 、Windows98、Windows2000 【实验内容】 创建进程并显示标识等进程控制块的属性信息; 显示父子进程的通信信息和相应的应答信息。 (进程间通信机制任选) 【实验程序及分析】 编程思路:首先本程序在Linux用C语言完成的,父子进程的创建用fork函数来实现,然后是父子进程间的通信,这里用pipe实现。可以定义chan1[2], chan1[2],chanx[0]表示读,chanx[1]表示写。他们配合使用。 【实验截图】 【实验心得体会】 通过这次上机练习,我熟悉了用c++实现进程的创建,销毁,父子进程间的通讯等一系列课程中需要学习的内容。本来进程的概念在一开始我始终无法清晰地理解,但是通过自己用mfc的方法去实现它后,我开始慢慢地理解操作系统的进程的运作机制。 虽然,我只是实现了一个父子进程的创建和通讯,但是,管中窥豹,我想自己开始明白一个操作系统正是由很多这种进程实现功能的。其中,系统整体的进程调度,管理等等还有很多东西等着我们去进一步学习、理解。 实验二进程间的同步 【实验目的】

理解进程同步和互斥模型及其应用 【实验软硬件环境】 Linux 、Windows98、Windows2000 【实验内容】 利用通信API实现进程之间的同步: 建立司机和售票员进程; 并实现他们间的同步运行。 【实验程序及分析】 程序总体思路:由于本次试验时用PV操作实现的互斥与同步模型,所以先实现P、V操作的函数,然后在主程序中利用PV操作函数实现司机和售票员的同步。司机和售票员分别为父进程和子进程,假设司机停车开门,此时为父进程中运行,然后申请开车,但是此时乘客没上车,所以只能阻塞。此时进入子进程,乘客上车,关门,售票员检票,释放开车,然后死机开车,到站,释放开车门。如此循环。 示意图 #include #include

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法 实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

目录

1.课程设计目的 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。 2.课程设计内容 设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进

程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 3、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到

磁盘调度算法

湖南工业大学 课程设计 资料袋 计算机与通信学院学院(系、部)20 08 ~ 20 09 学年第一学期课程名称操作系统指导教师职称讲师 学生姓名专业班级学号06408100139 题目磁盘调度算法的实现与分析 成绩起止日期2008 年12 月24 日~2009 年01 月06日 目录清单 序号材料名称资料数量备注 1 课程设计任务书 1 2 课程设计说明书 1 3 课程设计图纸 1 9 张4 5 6

湖南工业大学 课程设计任务书 2008 —2009 学年第1 学期 计算机与通信学院学院(系、部)专业班级 课程名称:操作系统 设计题目:磁盘调度算法的实现与分析 完成期限:自2008 年12 月24 日至2009 年01 月06 日共 2 周 内容及任务一、设计的主要技术参数 二、设计任务 1.先来先服务算法(FCFS) 2.最短寻道时间优先算法(SSTF) 3.扫描算法(SCAN) 4.循环扫描算法(CSCAN) 三、设计工作量 通过两周的时间进行设计、编码、测试、运行、书写实验报告。 进度安排 起止日期工作内容 2008-12-24至2008-12-27数据结构设计 2008-12-28至2008-12-30编写代码 2008-12-31至2009-01-01调试运行、修改 2009-01-02至2009-01-06得出最终程序、撰写实验报告 主要参考资料[1] 袁庆龙,候文义.Ni-P合金镀层组织形貌及显微硬度研究[J].太原理工 大学学报,2001,32(1):51-53. [2] 刘国钧,王连成.图书馆史研究[M].北京:高等教育出版社,1979:15-18, 31 [3] 孙品一.高校学报编辑工作现代化特征[C].中国高等学校自然科学学报研究会.科技编辑学论文集(2).北京:北京师范大学出版社,1998:10-22 指导教师(签字):年月日 系(教研室)主任(签字):年月日

天津理工大学操作系统实验3:磁盘调度算法的实现

人和以吟实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】 #include #include #include using namespace std; void Inith() { cout<<" 请输入磁道数: "; cin>>M; cout<<" 请输入提出磁盘 I/O 申请的进程数 cin>>N; cout<<" 请依次输入要访问的磁道号: "; for(int i=0;i>TrackOrder[i]; for(int j=0;j>BeginNum; for(int k=0;k=0;i--) for(int j=0;jSortOrder[j+1]) const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; // ------- int FindOrder[MaxNumber]; // ---------- double AverageDistance; // ----------- bool direction; // int BeginNum; // int M; // int N; // int SortOrder[MaxNumber]; // ------ bool Finished[MaxNumber]; 移动距离 ; 寻好序列。 平均寻道长度 方向 true 时为向外, false 开始磁道号。 磁道数。 提出磁盘 I/O 申请的进程数 排序后的序列 为向里

天津理工大学 操作系统实验3:磁盘调度算法地实现

实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 #include #include #include using namespace std; const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; //----移动距离; int FindOrder[MaxNumber]; //-----寻好序列。 double AverageDistance; //-----平均寻道长度 bool direction; //-----方向 true时为向外,false为向里 int BeginNum; //----开始磁道号。 int M; //----磁道数。 int N; //-----提出磁盘I/O申请的进程数 int SortOrder[MaxNumber]; //----排序后的序列 bool Finished[MaxNumber]; void Inith() { cout<<"请输入磁道数:"; cin>>M; cout<<"请输入提出磁盘I/O申请的进程数:"; cin>>N; cout<<"请依次输入要访问的磁道号:"; for(int i=0;i>TrackOrder[i]; for(int j=0;j>BeginNum; for(int k=0;k=0;i--) for(int j=0;jSortOrder[j+1])

磁盘调度实验报告

操作系统实验报告课程名称:计算机操作系统 实验项目名称:磁盘调度实验时间: 班级:姓名:学号: 实验目的: 对操作系统的磁盘调度基础理论和重要算法的理解,加强动手能力。 实验环境: PC机 win7 Visual C++ 实验内容: 编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵 活选择某算法,且以下算法都要实现: 1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN) 实验过程: 1.依次输入8个磁道数:123 45 31 67 20 19 38,并以0 结束 2.选择调度算法: (1)先来先服务算法(FCFS) (2)最短寻道时间优先算法(SSTF) 成绩: 指导教师(签名):

(3)扫描算法(SCAN) (4)循环扫描算法(CSCAN) 实验心得: 通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中

发现了自己的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。 附录: #include #include #include #include #define maxsize 1000 /*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效 { int i=0; while(str[i]!='\0') { if(str[i]<'0'||str[i]>'9') { return 0; break; } i++; } return i; } /******************将字符串转换成数字***********************/ int trans(char str[],int a) //将字符串转换成数字 { int i; int sum=0; for(i=0;icidao[j]) { temp=cidao[i]; cidao[i]=cidao[j]; cidao[j]=temp; } } cout<<" 排序后的磁盘序列为:"; for( i=0;i

操作系统实验 磁盘调度算法

操作系统 实验报告 哈尔滨工程大学 计算机科学与技术学院

第六讲磁盘调度算法 一、实验概述 1. 实验名称 磁盘调度算法 2. 实验目的 (1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机; (2)观察 EOS 实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法; (3)编写 CSCAN和 N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 3. 实验类型 验证性+设计性实验 4. 实验内容 (1)验证先来先服务(FCFS)磁盘调度算法; (2)验证最短寻道时间优先(SSTF)磁盘调度算法; (3)验证SSTF算法造成的线程“饥饿”现象; (4)验证扫描(SCAN)磁盘调度算法; (5)改写SCAN算法。 二、实验环境 在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。 三、实验过程 1. 设计思路和流程图 (1)改写SCAN算法 在已有 SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。算法流程图如下图所示。 图 3.1.1 SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法 在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside 确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。算法流程图如下图所示。

磁盘调度实验报告

操作系统实验报告 磁 盘 调 度

实验六:磁盘调度算法 一.实验目的 复习模拟实现一种磁盘调度算法,进一步加深对磁盘调度效率的理解。 二.实验属性 该实验为设计性实验。 三.实验仪器设备及器材 普通PC386以上微机 四.实验要求 本实验要求2学时完成。 本实验要求完成如下任务: (1)建立相关的数据结构,作业控制块、已分配分区及未分配分区 (2)实现一个分区分配算法,如最先适应分配算法、最优或最坏适应分配算法(3)实现一个分区回收算法 (4)给定一批作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理

实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。 五 .主要算法分析 各个算法分析 1.先来先服务算法(FCFS) 先来先服务(FCFS)调度:按先来后到次序服务,未作优化。 最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 2.最短寻道时间优先算法(SSTF) 最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论,现在当50号柱面的操作结束后,应该先处理61号柱面的请求,然后到达32号柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、159、199。 采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有

磁盘调度算法实验报告 (2)

磁盘调度算法 学生姓名: 学生学号: 专业班级: 指导老师: 2013年6月20日

1、实验目的: 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 2、问题描述: 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN 和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 3、需求分析 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 通过已知开始磁道数、访问磁道总数、磁道号访问序列、访问方向及访问方式得到访问序列及移动距离和平均移动距离! (1)输入的形式; int TrackOrder[MaxNumber];//被访问的磁道号序列 int direction;//寻道方向 int Num;//访问的磁道号数目

int start;// (2)输出的形式; int MoveDistance[MaxNumber]={0};//移动距离 double AverageDistance=0;//平均寻道长度 移动的序列! (3)程序所能达到的功能; 模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 (4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 开始磁道号:100 磁道号方向:内(0)和外(1) 磁道号数目:9 页面序列:55 58 39 18 90 160 150 38 184 4、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

操作系统实验报告

实验报告 实验课程名称:操作系统 实验地点:南主楼七楼机房 2018—2019学年(一)学期 2018年 9月至 2019 年 1 月 专业: 班级: 学号: 姓名: 指导老师:刘一男

实验一 实验项目:分时系统模拟 实验学时:2实验日期: 2018-10-25 成绩: 实验目的利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程; 假设有五个进程A,B,C,D,E,它们的到达时间及要求服务的时间分别为:进程名 A B C D E 到达时间0 1 2 3 4 服务时间 4 3 4 2 4 时间片大小为1,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:BDACE

(1)修改时间片大小为2,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:ADBCE (2)修改时间片大小为4,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间.

顺序:ABCDE 1、思考 时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?答:通过对时间片轮转调度算法中进程最后一次执行时间片分配的优化,提出了一种改进的时间片轮转调度算法,该算法具有更好的实时性,同时减少了任务调度次数和进程切换次数,降低了系统开销,提升了CPU的运行效率,使操作系统的性能得到了一定的提高。 A B C D E 时间片为1 周转时间12 9 14 8 13 3 3 3.5 4 3.25 带权周转 时间 时间片为2 周转时间8 12 13 7 13 2 4 3.25 3.5 3.25 带权周转 时间 时间片为4 周转时间 4 6 9 10 13 1 2 2.25 5 3.25 带权周转 时间

操作系统磁盘调度算法

操作系统课程设计任务书 题目: 磁盘调度算法 院系: 专业: 班级: 姓名: 学号: 指导教师: 设计时间:2018.1.1-2018.1.5 指导教师评语

目录 1、需求分析?4 1.1课题描述 (4) 1.2课题目的 (4) 1.3理论依据?7 2、概要设计?8 2.1设计方法 ............................................................................................... 82.2技术?8 2.3运行环境?8 3、详细设计?9 3.1流程图 (11) 3.2程序主要代码? 13 14 4、运行结果及分析? 4.1运行结果? 15 4.2结果详细分析?6 1 16 5、总结和心得? 7 1 6、参考文献? 2 7、附录:程序源代码? 3

1、需求分析 1.1课题描述 这次课程设计我研究的题目是:磁盘调度算法。具体包括三种算法分别是:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(电梯调度算法)(SCAN)。 1.2课题目的 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,扫描SCAN算法的实现方法。 1.3理论依据 设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。 平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N

操作系统实验报告

操作系统实验报告 学生学院计算机学院 专业班级计算机科学与技术3班学号3213005910 学生姓名林虹 指导教师丁国芳 2015 年12月15 日

目录 1 实验一进程调度 (1) 2 实验二银行家算法 (16) 3 实验三动态分区分配方式的模拟 (20) 4 实验四仿真各种磁盘调度算法 (26)

实验一进程调度 1. 实验目的 编写并调试一个模拟的进程调度程序,分别采用“短进程优先”、“时间片轮转”、“高响应比优先”调度算法对随机产生的五个进程进行调度,并比较算法的平均周转时间。以加深对进程的概念及进程调度算法的理解。 2. 实验要求 1.每个进程由一个进程控制块(PCB)表示,进程控制块可以包含如下信息:进程 名、优先数(响应比)、到达时间、需要运行时间(进程的长度)、已运行时间、进 程状态等等(可以根据需要自己设定)。 2.由程序自动生成进程(包括需要的数据,要注意数据的合理范围),第一个进程到 达时间从0开始,其余进程到达时间随机产生。 3.采用时间片轮转调度算法时,进程的运行时间以时间片为单位进行计算。 4.每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种 状态之一。 5.每进行一次调度,程序都要输出一次运行结果:正在运行的进程、就绪队列中的进 程、完成的进程以及各个进程的PCB,以便进行检查。 6.最后计算各调度算法的平均周转时间,并进行比较、分析。 3. 实验内容 a.算法原理 (1)短进程优先调度算法 “短进程优先”调度算法的基本思想是把CPU分配给就绪队列中需要时间最短的进程。 (2)时间片轮转算法 将系统中所有的就绪进程按照FCFS原则,排成一个队列。每次调度时将CPU 分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。进程可以未使用完一个时间片,就出让CPU。 (3)高响应比优先算法 HRRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。 每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

操作系统实验报告—磁盘调度算法

操作系统实验报告实验3 磁盘调度算法 报告日期:2016-6-17 姓名: 学号: 班级: 任课教师:

实验3 磁盘调度算法 一、实验内容 模拟电梯调度算法,实现对磁盘的驱动调度。 二、实验目的 磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。驱动调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。 三、实验原理 模拟电梯调度算法,对磁盘调度。 磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。 假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。 四、实验过程 1.画出算法流程图。

2.源代码 #include #include #include int *Init(int arr[]) { int i = 0; srand((unsigned int)time(0)); for (i = 0; i < 15; i++) { arr[i] = rand() % 200 + 1; printf("%d ", arr[i]); } printf("\n"); return arr; } void two_part(int arr[]) { int i = 0; int j = 0;

(第五讲磁盘调度算法)

实用标准文案 操作系统 实验报告

哈尔滨工程大学计算机科学与技术学院

一、实验概述 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)磁盘调度算法 (5.2)验证SCAN 算法能够解决“饥饿”现象 ( 6 ) 改写SCAN 调度算法 二、实验环境

EOS 操作系统与IDE 环境组成的“操作系统集成实验环境OS Lab ”。 三、实验过程 (一)实验问题及解答 1. 实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。 答:输出结果复制如下: 制作软盘镜像... 正在启动Virtual PC... 开始调试... ****** Disk schedule start working ****** Start Cylinder: 10 TID: 31 Cylinder: 8 Offset: 2 - TID: 32 Cylinder: 21 Offset: 13 + TID: 33 Cylinder: 9 Offset: 12 - TID: 34 Cylinder: 78 Offset: 69 + TID: 35 Cylinder: 0 Offset: 78 - TID: 36 Cylinder: 41 Offset: 41 + TID: 37 Cylinder: 10 Offset: 31 -

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法实 验报告 Last revision on 21 December 2020

目录

1.课程设计目的 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。 2.课程设计内容 设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进

程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 3、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到

实验报告六 磁盘调度算法

实验报告六磁盘调度算法 班级:软技2班学号:201467003084 姓名:刘道林 一.实验内容:熟悉磁盘的结构以及磁盘的驱动调度算法的模拟,编程实现简单常用的磁盘驱动调度算法先来先服务(FIFO)、 电梯调度算法、最短寻找时间优先算法、扫描(双向扫描)算法、单向扫描(循环扫描)算法等。编程只需实现两个算法。题目可 以选取教材或习题中的相关编程实例。编程语言建议采用c/c++或Java。模拟程序鼓励采用随机数技术、动态空间分配技术,有条件 的最好能用图形界面展现甚至用动画模拟。实验性质:验证型。 二.实验目的和要求1)掌握使用一门语言进行磁盘驱动调度算法的模拟;2)编写程序将磁盘驱动调度算法的过程和结果能以 较简明直观的方式展现出来。 三.实验原理、方法和步骤 1. 实验原理 磁盘驱动调度对磁盘的效率有重要影响。磁盘驱动调度算法的好坏直接影响辅助存储器的效率,从而影响计算机系统的整体效率。 常用的磁盘驱动调度算法有:最简单的磁盘驱动调度算法是先入先出(FIFO)法。这种算法的实质是,总是严格按时间顺序对磁盘请 求予以处理。算法实现简单、易于理解并且相对公平,不会发生进程饿死现象。但该算法可能会移动的柱面数较多并且会经常更换移 动方向,效率有待提高。最短寻找时间优先算法:总是优先处理最靠近的请求。该算法移动的柱面距离较小,但可能会经常改变 移动方向,并且可能会发生进程饥饿现象。电梯调度:总是将一个方向上的请求全部处理完后,才改变方向继续处理其他请求。 扫描(双向扫描):总是从最外向最里进行扫描,然后在从最里向最外扫描。该算法与电梯调度算法的区别是电梯调度在没有最外或 最里的请求时不会移动到最外或最里柱面,二扫描算法总是移到最外、最里柱面。两端的请求有优先服被务的迹象。循环扫描(单 向扫描):从最外向最里进行柱面请求处理,到最里柱面后,直接跳到最外柱面然后继续向里进行处理。该算法与扫描算法的区别是 ,回来过程不处理请求,基于这样的事实,因为里端刚被处理。 2. 实验方法 1)使用流程图描述演示程序的设计思想; 2)选取c/c++、Java等计算机语言,编程调试,最终给出运行正确的程序。

《操作系统》磁盘调度 (1)

《操作系统》实验 【实验题目】:磁盘调度算法 【实验目的】 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。 【实验内容】 问题描述: 设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 程序要求如下: 1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。 2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。 3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。 4)输出:每种算法的平均寻道长度。 实现提示: 用C++语言实现提示: 1)程序中变量定义参考(根据需要可添加)如下: const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; double AverageDistance; bool direction; 2)页面置换的实现过程如下: 变量初始化; 接收用户输入磁道个数n和磁盘访问序列,选择算法1-FCFS,2-SSTF,3-SCAN,4-循环SCAN,输入开始磁盘号m和磁头移动方向; 根据用户选择的算法进行磁道访问,输出磁盘调度算法的模拟过程; 计算选择每次移动的磁头移动距离和算法的平均寻道长度; 输出选择算法的平均寻道长度。 实验要求: 1) 上机前认真复习磁盘调度算法,熟悉FCFS,SSTF,SCAN和循环SCAN算法的过程; 2) 上机时独立编程、调试程序; 3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。

磁盘调度算法实验报告材料 (2)

磁盘调度算法 学生: 学生学号: 专业班级: 指导老师: 2013年6月20日

1、实验目的: 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 2、问题描述: 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN 和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 3、需求分析 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 通过已知开始磁道数、访问磁道总数、磁道号访问序列、访问方向及访问方式得到访问序列及移动距离和平均移动距离! (1)输入的形式; int TrackOrder[MaxNumber];//被访问的磁道号序列 int direction;//寻道方向 int Num;//访问的磁道号数目

int start;// (2)输出的形式; int MoveDistance[MaxNumber]={0};//移动距离 double AverageDistance=0;//平均寻道长度 移动的序列! (3)程序所能达到的功能; 模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 (4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 开始磁道号:100 磁道号方向:(0)和外(1) 磁道号数目:9 页面序列:55 58 39 18 90 160 150 38 184 4、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

操作系统课程设计-磁盘调度算法

前言 摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是:1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN)。启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送;因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。延迟时间——指定扇区旋转到磁头下所需的时间。传送时间——由磁头进程读写完成信息传送的时间,寻道时间——指计算机在发出一个寻址命令,到相应目标数据被找到所需时间;其中传送信息所花的时间,是在硬件设计时固定的,而寻找时间和延迟时间是与信息在磁盘上的位置有关;然后设计出磁盘调度的设计方式,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等,并给出详细的算法设计,对编码进行了测试与分析。最后进行个人总结与设计体会。 关键词:最短寻道时间优先算法、扫描算法、总寻道长度.

目录 前言 (1) 2. 课程设计任务及要求 (3) 2.1 设计任务 (3) 2.2 设计要求 (3) 3. 算法及数据结构 (3) 3.1算法的总体思想(流程) (3) 3.2 实现过程中用到的数据结构 (4) 3.3 实现过程中用到的系统调用 (9) 4. 程序设计与实现 (9) 4.1 最短寻道时间优先算法(SSTF)模块 (9) 4.1.1程序流程图 (9) 4.1.2 程序说明 (11) 4.1.3 程序关键代码 (11) 4.2扫描算法(SCAN)模块 (12) 4.2.1 程序流程图 (12) 4.2.2 程序说明 (14) 4.2.3 程序关键代码 (14) 4.3 实验结果 (15) 5. 结论 (24) 6. 参考文献 (24) 7. 收获、体会和建议 (25)

相关主题