磁盘调度算法实验报告
磁盘调度算法实验报告 Prepared on 22 November 2020
操作系统
实验报告
哈尔滨工程大学
计算机科学与技术学院
磁盘调度算法
一.实验概述:
1.实验名称:磁盘调度算法
2.实验目的:
1)通过学习 EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;
2)观察 EOS 实现的 FCFS、SSTF 和 SCAN 磁盘调度算法,了解常用的磁盘调度算法;
3)编写 CSCAN 和 N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。
3.实验类型:验证、设计
4.实验内容:
1)准备实验,创建一个EOS Kernel项目;
2)验证先来先服务(FCFS)磁盘调度算法;
3)验证最短寻道时间优先(SSTF)磁盘调度算法;
4)验证SSTF算法造成的线程“饥饿现象”;
5)验证扫描(SCAN)磁盘调度算法;
6)改写SCAN算法;
7)编写循环扫描(CSCAN)磁盘调度算法;
8)验证SSTF、SCAN及CSCAN算法中的“磁臂粘着”现象;
9)编写N-Step-SCAN磁盘调度算法。
二.实验环境
操作系统:windows XP
编译器:Tevalaton OS Lab
语言:C
三.实验过程
1.设计思路和流程图:
SCAN算法流程图:
SSTF算法的流程图:
CSACN流程图:
1)新建一个 EOS Kernel 项目;
2)在文件中找到控制台命令“ds”对应的函数 ConsoleCmdDiskSchedule。“ ds”命令专门用来测试磁盘调度算法。阅读该函数中的源代码,目前该函数使磁头初始停留在磁道 10,其它被阻塞的线程依次访问磁道 8、21、9、78、0、41、10、67、12、10;
3)打开 io/ 文件,在第 378 行找到磁盘调度算法函数 IopDiskSchedule。阅读该函数中的源代码,目前此函数实现了 FCFS 磁盘调度算法,流程图如下:
4)生成项目,启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“ds”后按回车;
在 EOS 控制台中会首先显示磁头的起始位置是 10 磁道,然后按照线程被阻塞的顺序依次显示线程的信息(包括线程 ID 和访问的磁道号)。磁盘调度算法执行的过程中,在 OS Lab 的“输出”窗口中也会首先显示磁头的起始位置,然后按照线程被唤醒的顺序依次显示线程信息(包括线程 ID、访问的磁道号、磁头移动的距离和方向),并在磁盘调度结束后显示此次调度的统计信息(包括总寻道数、寻道次数和平均寻道数)。对比 EOS 控制台和“输出”窗口中的内容,可以发现 FCFS 算法是根据线程访问磁盘的先后顺序进行调度的。下图显示了本次调度执行时磁头移动的轨迹:
5)打开文件,该文件提供的 IopDiskSchedule 函数实现了 SSTF 磁盘调度算法,其中应注意:
①变量 Offset 是有符号的长整型,用来表示磁头的偏移(包括距离和方向)。Offset 大于 0 时表示磁头向内移动(磁道号增加);小于 0 时表示磁头向外移动(磁道号减少);等于 0 时表示磁头没有移动。而名称以“Distance”结尾的变量都是无符号长整型,只表示磁头移动的距离(无方向)。所以在比较磁头的偏移和距离时,或者在将偏移赋值给距离时,都要取偏移的绝对值(调用 C 库函数 abs)。本实验在实现其它磁盘调度算法时也同样遵守此约定;
②在开始遍历之前,将最小距离(ShortestDistance)初始化为最大的无符号长整型数,这样,第一次计算的距离一定会小于最小距离,从而可以使用第一次计算的距离来再次初始化最小距离。本实验在实现其它磁盘调度算法时也同样使用了此技巧。
6)生成项目,启动调试,待EOS 启动完毕,在 EOS 控制台中输入命令“ds”后按回车;
对比 EOS 控制台和“输出”窗口中的内容(特别是线程 ID 的顺序),可以发现,SSTF 算法唤醒线程的顺序与线程被阻塞的顺序是不同的。图18-4显示了本次调度执行时磁头移动的轨迹。对比SSTF算法与FCFS 算法在“输出”窗口中的内容,可以看出,SSTF 算法的平均寻道数明显低于 FCFS 算法。
7)验证SSTF算法造成的线程“饥饿现象”,使用 SSTF 算法时,如果不断有新线程要求访问磁盘,而且其所要访问的磁道与当前磁头所在磁道的距离较近,这些新线程的请求必然会被优先满足,而等待队列中一些老线程的请求就会被严重推迟,从而使老线程出现“饥饿”现象。
8)修改文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道 78、21、9、8、11、41、10、67、12、10,生成项目,启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“ds”后按回车;
查看“输出”窗口中显示的内容,可以发现,虽然访问 78 号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“饥饿”现象。如果不断有新线程的请求到达并被优先满足,则访问 78 号磁道的线程的“饥饿”情况就会更加严重;
修改访问磁道顺序:
修改后执行“ds”命令的结果:
多次输入“ds”命令:
9)对 SSTF 算法稍加改进后可以形成 SCAN 算法,可防止老线程出现“饥饿”现象。打开文件,该文件提供的 IopDiskSchedule 函数实现了 SCAN 磁盘调度算法。其中应注意下面几点:
①在文件中的第 374 行定义了一个布尔类型的全局变量 ScanInside,用于表示扫描算法中磁头移动的方向。该变量值为 TRUE 时表示磁头向内移动(磁道号增加);值为 FALSE 时表示磁头向外移动(磁道号减少)。该变量初始化为TRUE,表示 SCAN 算法第一次执行时,磁头向内移动;
②在文件的 IopDiskSchedule 函数中使用了双重循环。第一次遍历队列时,查找指定方向上移动距离最短的线程,如果在指定方向上已经没有线程,就变换方向,进行第二次遍历,同样是查找移动距离最短的线程。在这两次遍历中一定能找到合适的线程。
10)使用文件中 IopDiskSchedule 函数的函数体,替换文件中 IopDiskSchedule 函数的函数体,生成项目,启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“ds”后按回车;
对比 SCAN 算法与 SSTF 算法在“输出”窗口中的内容,可以看出,SCAN 算法的平均寻道数有可能小于 SSTF 算法,所以说 SSTF 算法不能保证平均寻道数最少。下图显示了本次调度执行时磁头移动的轨迹:
11)改写SCAN算法,算法提示:
①在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次;
②在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,可以将偏移分为三种类型:偏移为 0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于 0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求;
③循环结束后,根据当前磁头移动的方向选择同方向移动距离最短的线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短的线程;
流程如下所示:
SCAN改写代码:
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 = ; // 请求队列中的第一个请求是链表头指向的下一个请求。
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
// 记录向内移动距离最短的线程
InsideShortestDistance = Offset;
INpNextRequest = pRequest;
} else if (-Offset < OutsideShortestDistance && Offset < 0) {
// 记录向外移动距离最短的线程
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;
}
修改完SCAN算法后输入“ds”命令:
12) 在已经完成的 SCAN 算法源代码的基础上进行改写,不再使用全局变量ScanInside 确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。
由于磁头移动的方向被固定,也就不需要根据磁头移动的方向进行分类处理,所以 CSCAN 算法的源代码会较 SCAN 算法更加简单。
改写提示:
①由于规定了磁头只能从外向内移动,所以在每次遍历中,总是同时找到向内移动距离最短的线程和向外移动距离最长的线程。注意,与 SCAN 算法查找向外移动距离最短线程不同,这里查找向外移动距离最长的线程。在开始遍历前,可以将用来记录向外移动最长距离的变量赋值为0;
②在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,同样可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最长的线程对应的请求;
③循环结束后,选择向内移动距离最短的线程,如果没有向内移动的线程,就选择向外移动距离最长的线程。
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 = ; // 请求队列中的第一个请求是链表头指向的下一个请求。
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
// 记录向内移动距离最短的线程
InsideShortestDistance = Offset;
INpNextRequest = pRequest;
} else if (-Offset > OutsideShortestDistance && Offset < 0) {
// 记录向外移动距离最短的线程
OutsideShortestDistance = -Offset;
OUTpNextRequest = pRequest;
}
}
//需要向内移动的线程是否存在
if(INpNextRequest){
//存在则返回向内移动的请求
return INpNextRequest;
}
else{
//没有则返回向外移动的请求
return OUTpNextRequest;
}
RETURN:
return pNextRequest;
}
13)启动修改后的程序,输入“ds”命令,查看磁盘调度算法的执行情况。
14)观察执行 SSTF、SCAN 及 CSCAN 算法时磁头移动的轨迹可以看到,在开始时磁头都停留在10磁道不动,这就是“磁臂粘着”现象,通过修改代码,进一步观察。
修改文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道 78、10、10、10、10、10、10、10、10、10,分别使用 SSTF、SCAN 和 CSCAN 算法调度这组数据。
查看各种算法在“输出”窗口中显示的内容,可以发现,虽然访问 78 号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“磁臂粘着”现象。
SCAN算法测试:
CSCAN算法测试:
SSTF算法测试:
15)在已经完成的 SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为 N 的子队列,调度程序按照 FCFS 原则依次处理这些子队列,而每处理一个子队列时,又是按照 SCAN 算法,修改提示:
①在文件中的第 360 行定义了一个宏 SUB_QUEUE_LENGTH,表示子队列的长度(即 N 值)。目前这个宏定义的值为 6。在第 367 行定义了一个全局变量
SubQueueRemainLength,表示第一个子队列剩余的长度,并初始化其值为
SUB_QUEUE_LENGTH;
②在执行 N-Step-SCAN 算法时,要以第一个子队列剩余的长度做为计数器,确保只遍历第一个子队列剩余的项。所以,结束遍历的条件就既包括第一个子队列结束,又包括整个队列结束(如果整个队列的长度小于第一个子队列剩余的长度)。注意,不要直接使用第一个子队列剩余的长度做为计数器,可以定义一个新的局部变量来做为计数器;
③按照 SCAN 算法从第一个子队列剩余的项中选择一个合适的请求。最后,需要将第一个子队列剩余长度减少 1(SubQueueRemainLength 减少 1),如果第一个子队列剩余长度变为 0,说明第一个子队列处理完毕,需要将子队列剩余的长度重新变为 N(SubQueueRemainLength 重新赋值为 SUB_QUEUE_LENGTH),从而开始处理下一个子队列;
修改代码:
// N-Step-SCAN 磁盘调度算法使用的子队列长度 N
#define SUB_QUEUE_LENGTH
// 记录 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--;
//如果子队列剩余长度为0,则重置为子队列原长度
if(SubQueueRemainLength==0)
SubQueueRemainLength=SUB_QUEUE_LENGTH;
for (pListEntry = ; // 请求队列中的第一个请求是链表头指向的下一个请求。
pListEntry != &RequestListHead && counter>0; // 遍历到请求队列头时结束循环或子队列结束。
pListEntry = pListEntry->Next) {
// 根据链表项获得请求的指针
pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);
// 计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移(方向由正负表示)
Offset = pRequest->Cylinder - CurrentCylinder;
if (0 == Offset) {
// 如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。
pNextRequest = pRequest;
goto RETURN;
} else if (Offset
// 记录向内移动距离最短的线程
InsideShortestDistance = Offset;
INpNextRequest = pRequest;
} else if (-Offset < OutsideShortestDistance && Offset < 0) {
// 记录向外移动距离最短的线程
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;
}
}
}
16)生成项目,启动程序,在控制台中多次输入“ds”命令,查看磁盘调度算法的执行情况。
输入“ds”命令进行测试:
将宏定义 SUB_QUEUE_LENGTH 的值修改为 100,算法性能接近于 SCAN 算法的性能;将宏定义 SUB_QUEUE_LENGTH 的值修改为 1,算法退化为 FCFS 算法。
四.实验体会
通过本次实验的具体操作,了解了磁盘调度的SSTF算法、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
作业调度_实验报告
实验名 称 作业调度 实验内容1、设计可用于该实验的作业控制块; 2、动态或静态创建多个作业; 3、模拟先来先服务调度算法和短作业优先调度算法。 3、调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间); 3、比较两种调度算法的优劣。 实验原理一、作业 作业(Job)是系统为完成一个用户的计算任务(或一次事物处理)所做的工作总和,它由程序、数据和作业说明书三部分组成,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。 二、作业控制块J C B(J o b C o nt r o l Bl o ck) 作业控制块JCB是记录与该作业有关的各种信息的登记表。为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。 三、作业调度 作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。 四、选择调度算法的准则 1).面向用户的准则 (1) 周转时间短。通常把周转时间的长短作为评价批处理系统的性能、选择作业调度方式与算法的重要准则之一。所谓周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称
操作系统磁盘调度算法实验报告
操作系统磁盘调度算法 实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】
目录
1.课程设计目的 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。 2.课程设计内容 设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进
程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 3、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到
天津理工大学操作系统实验3:磁盘调度算法的实现
人和以吟实验报告学院(系)名称:计算机与通信工程学院
【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】 #include
天津理工大学 操作系统实验3:磁盘调度算法地实现
实验报告学院(系)名称:计算机与通信工程学院
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 #include
作业调度实验报告
实验二作业调度 一. 实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS,最短作业优先(SJF)、响应 比高者优先(HRN的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业, 先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准, 总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进 行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二. 实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三. 实验过程 < 一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析:
1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资 源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到 满足,它所占用的CPU时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、 提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业 的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一 每个作业的最初状态总是等待W 3、对每种调度算法都要求打印每个作业幵始运行时刻、完成时刻、周转时 间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间 3) 流程图: .最短作业优先算法 三.高响应比算法 图一.先来先服务流程图 4) 源程序: #in elude
磁盘调度实验报告
操作系统实验报告课程名称:计算机操作系统 实验项目名称:磁盘调度实验时间: 班级:姓名:学号: 实验目的: 对操作系统的磁盘调度基础理论和重要算法的理解,加强动手能力。 实验环境: 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) 实验心得: 通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中