FIFO磁盘调度算法操作系统课程设计报告_(1)
操作系统课程设计磁盘调度报告

题目:磁盘调度一.设计目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手能力。
二.课程设计内容和要求编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵活选择某算法,且以下算法都要实现:1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)三.算法及数据结构3.1算法的总体思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。
因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间。
其中传送信息所花的时间,是在硬件设计就固定的。
而寻找时间和延迟时间是与信息在磁盘上的位置有关。
为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。
磁盘调度算法程序课程设计报告(DOC)

1)、设计一个函数完成先来先服务的磁盘调度功能。
2)、设计一个函数完成最短寻道时间优先的磁盘调度功能。
3)、设计一个函数完成电梯算法的磁盘调度功能。
二、系统需求分析
2.1
1、可利用先来先服务算法(FCFS即first come first served)、最短寻道时间优先算法(SSTF即shortest seek time first)、扫描算法(SCAN),来实现磁盘的访问顺序。
5.6.1先向外扫描11
5.6.2先向里扫描11
5.7退出程序11
六、结论与体会12
一、课程设计的目的和要求
1
磁盘是经常使用的一种重要的外设,对磁盘数据的寻道时间的长短直接影响机器的整体运行速度,本设计要求用C语言(或高级语言)编写程序模拟实现磁盘调度的常用算法。以加深对磁盘调度常用算法的理解和实现技巧。
3.扫描算法模块:void SCAN(int cidao[],int m)
将磁道号用冒泡法从小到大排序,输出排好序的序列,输入当前磁道号,选择移动臂的移动方向,根据当前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规ຫໍສະໝຸດ 颇似电梯的运行,故又称为电梯调度算法。
2.最短寻道时间优先算法模块:void SSTF(intcidao[],intm)
操作系统磁盘调度算法实验报告

目录一、课程设计目的 (3)二、课程设计要求 (3)三、课程设计原理 (3)四、程序代码 (5)五、流程图设计 (11)六、运行结果 (14)七、调试分析 (16)八、心得体会 (16)一、课程设计目的操作系统是最重要的计算机系统软件,同时也是最活跃的学科之一,发展极为迅速。
我们在本课程的实验过程中,要了解实际操作系统的工作过程,加深对操作系统基础理论和重要算法的理解,在实践过程中加深对操作系统原理的理解。
通过设计一个磁盘调度模拟系统,以加深对先来先服务、最短寻道时间、电梯算法以及循环扫描算法等磁盘调度算法的理解。
让我们更好地掌握操作系统中磁盘调度的原理及实现方法,增强动手能力。
本实验通过对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windows平台上实现,也再一次提高了自己编程的能力,提高了综合运用专业课知识的能力。
二、课程设计要求本设计的具体要求如下:1.模拟一个磁盘调度算法2.要求能够模拟FCFS、最短寻道时间、电梯算法等磁盘调度算法3.输入为一组作业的磁道请求4.输出为按选择的算法执行时的磁头移动轨迹三、课程设计原理1.各个算法分析(1)先来先服务算法(FCFS)这是一种最简单的磁盘调度算法。
它根据请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。
但是此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
当有进程先后提出磁盘I/O请求时,先按他们发出请求的先后次序排队。
然后依次给予服务。
其平均寻道距离较大,故先来先服务算法仅适用于请求磁盘I/O进程数目较少的场合。
(2)最短寻道时间优先算法(SSTF)该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次寻道时间最短。
但这种算法不能保证平均寻道时间最短。
有可能导致某个进程出现“饥饿”现象,因为只要不断有新进程请求到达,且其所要访问的磁道与磁头当前所在的磁道的距离较近,这种新进程的I/O请求必然优先满足。
磁盘调度 操作系统实验报告

实验一磁盘调度算法实现一、实验目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。
二、实验内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
2.1先来先服务算法( FCFS )这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2.2 最短寻道时间优先算法( SSTF )该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
2.3 扫描算法( SCAN )扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
操作系统课程设计任务书-1(磁盘调度)

班 级
指 导 教 师成新田
金陵科技学院算机系统的一个重要系统软件。操作系统质量的好坏,直接影响整个计算机系统的性能和用户对计算机的使用。本课程设计通过模拟实现操作系统中的某个功能子模块或部分算法,希望学生了解实际操作系统的工作过程,在实践中加深理解有关进程控制块、进程队列、死锁、调度等概念,体会和了解系统中重要算法的具体实施办法,提高学生实际应用和编程的技能。
2.课程设计题目及要求
磁盘是经常使用的一种重要的外设,对磁盘数据的寻道时间的长短直接影响机器的整体运行速度,本设计要求用C语言(或高级语言)编写程序模拟实现磁盘调度的常用算法。以加深对磁盘调度常用算法的理解和实现技巧。
1)、设计一个函数完成先来先服务的磁盘调度功能。
2)、设计一个函数完成最短寻道时间优先的磁盘调度功能。
中
能完成任务书所规定的各项任务,对所研究的问题表现出一定的分析、计算、论证能力;说明书、图纸质量一般;完成的软、硬件尚能达到规定的性能指标;语言较准确,文档基本齐全,书写比较规范。
良好
能完成任务书所规定的各项任务,对所研究的问题分析、计算、论证能力较强,某些见解有一定新意;说明书、图纸符合规范,质量较高;完成的软、硬件基本达到规定的性能指标;语言准确、流畅,文档齐全,书写规范。
6、孟庆昌.操作系统教程.西安:西安电科大出版社,2008
5.课程设计时间安排
起 止 日 期
工 作 内 容
2018年12月12日-12月18日
2018年12月19日-1月2日
2018年1月2日-1月2日
复习相关理论知识,或查阅资料、理解训练要求
根据设计要求,确定方案,程序设计
上机调试,验证程序设计正确性
设计总结报告
操作系统实验磁盘调度算法实验报告

if(a==0)
{
cout<<"输入数据的类型错误,请重新输入!"<<endl;
goto F;//输入错误,跳转到F,重新输入
}
else
c=trans(str,a);
if(c==5)
break;
if(c>5)
{
cout<<"数据输入错误!请重新输入"<<endl;
goto G;
1、实验目的
通过这个实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。
2、实验内容
利用高级语言编写先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。
3、实验环境
1.PC微机。
2.Windows操作系统。
3.C/C++/VB开发集成环境。
cout<<"* 4. 循 环 扫 描 *"<<endl;
cout<<"* 5. 退 出 *"<<endl;
cout<<"* *"<<endl;
cout<<"********************************"<<endl;
G:cout<<"请选择算法:";
F:cin>>str; //对输入数据进行有效性判断
break;
}
}
}
5、实验结果
成绩评定:
1、根据实验情况和实验报告质量作出写事性评价
操作系统课设报告磁盘调度算法
课程设计报告课程名称: 操作系统课程设计课题名称: 磁盘调度算法学院: 软件学院班级:学生姓名:学号:指导教师:磁盘调度算法一、系统需求分析磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取,是当前存放大量程序和数据的理想设备。
所以在现代计算机中都配备了磁盘存储器,以他为主存放文件,这样对文件的读、写操作都涉及到了对磁盘存储器的访问。
磁盘I/O速度的高低和磁盘系统的可靠性,都直接影响到系统的性能。
因此改善磁盘系统的性能成为现代操作系统的重要任务之一。
磁盘性能有数据的组织、磁盘的类型和访问时间等。
可以通过选择好的磁盘调度算法,以减少磁盘的寻道时间。
为了减少对文件的访问时间,应采用一种最佳的磁盘调度算法,以使各进程对磁盘的平均访问时间最少。
由于在访问磁盘的时间中主要是寻道时间,因此,磁盘调度的目标是使磁盘的寻道时间最少。
所以本课程设计对各个算法进行模拟,进而比较分析了解。
二、实验内容和目的2.1.实验内容模拟电梯调度算法,实现对磁盘的驱动调度。
设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)2.2.实验原理模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。
当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
三、总体设计及分类简介3.1算法介绍磁盘调度中常用的有四种算法,功能分别如下:1.先来先服务(FCFS)算法。
即先来的请求先被响应。
FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。
磁盘调度算法的设计实验报告
磁盘调度算法的设计实验报告一、实验背景磁盘调度算法是操作系统中的重要内容之一,它的主要作用是优化磁盘的读写效率,提高系统的性能。
本次实验旨在通过设计不同的磁盘调度算法,比较它们在不同情况下的性能表现。
二、实验环境本次实验使用了Linux操作系统和C语言编程语言。
硬件环境为Intel Core i5处理器、4GB内存和500GB硬盘。
三、实验过程1. 先来看看什么是磁盘调度算法。
磁盘调度算法是指操作系统中用于管理磁盘I/O请求队列的算法。
常见的磁盘调度算法有FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)、LOOK(往返扫描)等。
2. 接下来我们分别对这些算法进行设计和实现,并进行性能测试。
3. 首先是FCFS算法。
FCFS算法就是按照请求到达时间的顺序进行服务,即先来先服务。
我们通过模拟生成一组随机数作为请求队列,然后计算出每个请求需要移动的距离,并计算出平均寻道长度。
4. 然后是SSTF算法。
SSTF算法是指选择距离当前磁头位置最近的请求进行服务。
我们同样使用模拟生成一组随机数作为请求队列,然后计算出每个请求与当前磁头位置的距离,并按照距离从小到大进行排序,然后依次服务每个请求,并计算出平均寻道长度。
5. 接下来是SCAN算法。
SCAN算法是指磁头从一端开始移动,直到到达另一端,然后返回原点继续移动。
我们同样使用模拟生成一组随机数作为请求队列,并将其按照磁头当前位置的左右分成两部分,分别从左往右和从右往左进行服务,并计算出平均寻道长度。
6. 最后是LOOK算法。
LOOK算法和SCAN类似,不同之处在于当服务完最远的请求时不会返回原点,而是直接返回最近的请求。
我们同样使用模拟生成一组随机数作为请求队列,并将其按照磁头当前位置的左右分成两部分,分别从左往右和从右往左进行服务,并计算出平均寻道长度。
四、实验结果通过对以上四种磁盘调度算法进行测试,得到以下结果:1. FCFS平均寻道长度:1622. SSTF平均寻道长度:783. SCAN平均寻道长度:984. LOOK平均寻道长度:87五、实验结论从实验结果可以看出,SSTF算法的性能最优,平均寻道长度最短。
操作系统课程设计-磁盘调度算法
前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是:1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN)。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送;因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间,寻道时间——指计算机在发出一个寻址命令,到相应目标数据被找到所需时间;其中传送信息所花的时间,是在硬件设计时固定的,而寻找时间和延迟时间是与信息在磁盘上的位置有关;然后设计出磁盘调度的设计方式,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等,并给出详细的算法设计,对编码进行了测试与分析。
最后进行个人总结与设计体会。
关键词:最短寻道时间优先算法、扫描算法、总寻道长度.目录前言 (2)2. 课程设计任务及要求 (4)2.1 设计任务 (4)2.2 设计要求 (4)3. 算法及数据结构 (5)3.1算法的总体思想(流程) (5)3.2 实现过程中用到的数据结构 (6)3.3 实现过程中用到的系统调用 (11)4. 程序设计与实现 (11)4.1 最短寻道时间优先算法(SSTF)模块 (11)4.1.1程序流程图 (11)4.1.2 程序说明 (13)4.1.3 程序关键代码 (13)4.2扫描算法(SCAN)模块 (14)4.2.1 程序流程图 (14)4.2.2 程序说明 (16)4.2.3 程序关键代码 (16)4.3 实验结果 (17)5. 结论 (26)6. 参考文献 (26)7. 收获、体会和建议 (27)2. 课程设计任务及要求2.1 设计任务1.熟悉并掌握磁盘调度算法管理系统的设计方法,加强对所学各种调度算法及相应算法的特点了解。
操作系统课程设计报告 磁盘调度算法
华南农业大学数学与信息学院(软件学院)《操作系统分析与设计实习》成绩单开设时间:2015学年第一学期一、需求分析(1)输入的形式和输入值的范围:在文本框输入序列长度,输入值为int类型(2)输出的形式:输出每种磁盘调度算法的服务序列;输出每种算法的平均寻道长度。
(3)程序所能达到的功能:模拟实现FCFS、SSTF、SCAN、C-SCAN 算法,并计算及比较磁头移动道数。
(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果:二、概要设计1)主程序流程图:输出随机生成400个磁道号序列主菜单选择算法开始FCFS SSTFSCANC-SCAN 结束(2)各程序模块之间的调用关系磁头初始位置输入及合法性检查冒泡排序算法由外向内输出磁道序列由内向外输出磁道序列由当前位置向内再向外输出磁道序列由当前位置向外再向内输出磁道序列由当前位置向内再由外向内输出磁道序列由当前位置向外再由内向外输出磁道序列就近选择主函数FCFSSSFTSCANC-SCAN三、详细设计1)各操作伪码算法(1)实现磁头初始位置的输入并进行合法性检查int printstarter()//磁头初始位置输入{输入:磁头初始位置;if输入小于0或大于1500{输出:"输入数据类型有误,请重新输入!"<<endl;重新输入}Else 返回合法的磁头初始位置}(2)冒泡排序算法int *bubble//冒泡排序算法{for 从数组的第一个元素开始重复{依次和后续元素表较大小;If后面元素大于当前元素交换数值;}输出排序后的数组;返回数组;}(3)int out_to_in//由磁道最外向内输出磁道序列{for 从最外磁道开始{依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;磁头初始位置=当前磁道号;}返回绝对值之和;}(4)int in_to_out//由磁道最内向外输出磁道序列{for 从最内磁道开始{依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;磁头初始位置=当前磁道号;}返回绝对值之和;}(5)int out_to_in_to_out//先由当前位置向内再向外{找到小于等于磁头初始位置的磁道for由该磁道开始{向内依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}for由该磁道的外侧磁道开始{向外依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}返回绝对值之和;}(6)int in_to_out_to_in//先由当前位置向外再向内{找到大于等于磁头初始位置的磁道for由该磁道开始{向外依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}for由该磁道的内侧磁道开始{向内依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}返回绝对值之和;}(7)int out_to_in_twice由当前磁道向内再从最外向内{找到小于等于磁头初始位置的磁道;for由该磁道开始{向内依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}for由最外侧磁道开始{向内依次输出磁道号直到小于等于初始位置的磁道的外侧一个磁道;当前磁道号与磁头初始未至的绝对值求和;}返回绝对值之和;}(8)int in_to_out_twice由当前磁道向外再从最内向外{找到大于等于磁头初始位置的磁道for由该磁道开始{向内依次输出磁道号;当前磁道号与磁头初始未至的绝对值求和;}for由最内侧磁道开始{向外依次输出磁道号直到小于等于初始位置的磁道的内侧一个磁道;当前磁道号与磁头初始未至的绝对值求和;}返回绝对值之和;}(9)int nearest_select就近选择{找到大于磁头初始位置的磁道;while初始位置内侧差绝对值更小{输出内侧磁道号;绝对值差求和;初始位置更新为当前磁道号;}while 初始位置外侧绝对值差更小{输出外侧磁道号;绝对值差求和;初始位置更新为当前磁道号;}}If已到达最内侧未到达最外侧{if内侧绝对值差更小{输出最内侧磁道号;绝对差值求和;初始位置更新;while 向外侧依次输出磁道号直到到达最外侧{绝对差值求和;更新初始位置;}}else外侧绝对值差更小{While向外侧依次输出磁道号直到到达最外侧{绝对差值求和;更新初始位置;}输出最内侧磁道号;绝对差值求和;更新初始位置;}}if 已到达最外侧未到达最内侧{If外侧绝对值更小{输出最外侧磁道号;绝对差值求和;更新初始位置;while向内依次输出磁道号{绝对差值求和;更新初始位置;}}else{while 向内依次输出磁道号{绝对差值求和;更新初始位置;}输出最外侧磁道号;绝对值差求和;更新初始位置;}}if均到达最内侧和最外侧{if 外侧差绝对值更小{输出最外侧磁道号并绝对值差求和;输出最内侧磁道号并绝对值差求和;}else{输出最内侧磁道号并绝对值差求和;输出最外侧磁道号并绝对值差求和;}}求总和并返回;}(10)void FCFS算法{输出磁盘请求序列为;按照磁盘请求序列依次输出磁盘扫描序列;当前磁道号与磁头初始未至的绝对值求和;求平均值;输出平均寻道长度;}(11)void SSTF算法{if序列中最大的磁道号小于磁头初始位置{调用out_to_in直接由外向内;}if 序列中最小的磁道号大于磁头初始位置{调用in_to_out直接由内向外;}If 磁头初始位置为中间值{调用就近选择算法;}求均值;输出平均寻道时间;}(12)void SCAN算法{输入:磁臂移动方向(1:向外,0:向内);if 序列中最大的磁道号小于磁头初始位置{调用out_to_in直接由外向内;}if序列中最小的磁道号大于磁头初始位置{调用in_to_out直接由内向外;}if 初始磁头位置为中间值{if 磁臂方向向内{调用out_to_in_to_out;}if 磁臂方向向外{调用n_to_out_to_in;}}求均值;输出平均寻道时间;}(13)Viod C-SCAN算法{请输入磁臂移动方向(1:向外,0:向内);if 序列中最大磁道号小于等于磁头初始位置{if磁臂方向向内{调用out_to_in;}if磁臂方向向外{调用in_to_out;}}if 序列中最大磁道号大于等于磁头初始位置{if磁臂方向向内{调用out_to_in;}if磁臂方向向外{调用in_to_out;}}if初始磁头位置为中间值{if (磁臂方向向内{调用out_to_in_twice;}if 磁臂方向向外{调用in_to_out_twice);}}求均值;输出平均寻道时间;}(14)主函数int main(){随机生成200个0~499的磁道序列并输出;随机生成100个500~999的磁道序列并输出;随机生成100个1000~1500的磁道序列并输出;输出:主菜单;输入:用户选择并进行合法性检查switch (用户选择){case 1:调用FCFS();case 2:调用SSTF()case 3:调用SCAN()case 4:调用C-SCAN()case 5:退出}}2)函数的调用关系图四、调试分析1)调试过程中遇到的问题以及对设计与实现的讨论和分析:(1)随机生成400个磁道号序列:使用rand()函数,对于:50%位于 0~499,25%分布在 500~999,25%分布在 1000~1499,采用如下方法解决:track[i] = (rand() % 500);track[i] = (rand() % 500)+500;track[i] = (rand() % 500)+1000;(2)通过对每一行的输出设置断点判断问题出现在哪里,把出问题的地方缩小到一定范围,然后解决问题,如若解决不出则上网查询。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FIFO磁盘调度算法操作系统课程设计报告_(1)哈尔滨理工大学课程设计(计算机操作系统)题目: FIFO磁盘调度算法班级:姓名:指导教师:系主任:2014年03月01日目录1FIFO磁盘调度算法课程设计 (1)1.1 题目分析 (1)1.2 数据结构 (1)1.3 流程图 01.4 实现技术 (1)1.5 设计结论和心得 (4)2 Linux代码分析 (5)2.1 功能说明 (15)2.2 接口说明 (15)2.3 局部数据结构 (15)2.4 流程图 (16)2.5 以实例说明运行过程 (16)- -1FIFO磁盘调度算法课程设计1.1题目分析本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务磁盘调度算法的理解。
这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
1.2数据结构1 先来先服务算法模块:void FCFS(int array[],int m)输入磁道号,按先来先服务的策略输出磁盘请求序列,求平均寻道长度,输出移动平均磁道数。
主要代码:for(i=0,j=1;j<m;i++,j++){sum+=abs(array[j]-array[i]);ave=(float)(sum)/(float)(m);}1.3流程图FIFO算法流程图:开输入按输入顺序将求平均输出移动的结1.4实现技术为实现上述设计,采用C++语言,VS2008开发环境。
具体采用的技术如下:(1)(2)实现步骤如下:(1)输入磁道序列、当前磁道号(2)FIFO磁盘调度(3)输出平均磁道数运行结果如下:1.5设计结论和心得通过课程设计得到如下结论:(1)本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。
本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。
有如下几点心得体会:(1)通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。
设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。
2 Linux代码分析为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#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;i<a;i++){sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));}return sum;}/*********************冒泡排序算法**************************/int *bubble(int cidao[],int m){int i,j;int temp;for(i=0;i<m;i++) //使用冒泡法按从小到大顺序排列for(j=i+1;j<m;j++){if(cidao[i]>cidao[j]){temp=cidao[i];cidao[i]=cidao[j];cidao[j]=temp;}}cout<<"排序后的磁盘序列为:";for( i=0;i<m;i++) //输出排序结果{cout<<cidao[i]<<" ";}cout<<endl;return cidao;}/*********************先来先服务调度算法**************************/ void FCFS(int cidao[],int m) //磁道号数组,个数为m{int now;//当前磁道号int sum=0; //总寻道长度int j,i;int a;char str[100];float ave; //平均寻道长度cout<<"磁盘请求序列为:";for( i=0;i<m;i++) //按先来先服务的策略输出磁盘请求序列{cout<<cidao[i]<<" ";}cout<<endl;cout<<"请输入当前的磁道号:";B: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto B;}elsenow=trans(str,a); //输入当前磁道号sum+=abs(cidao[0]-now);cout<<"磁盘扫描序列为:";for( i=0;i<m;i++) //输出磁盘扫描序列{cout<<cidao[i]<<" ";}for(i=0,j=1;j<m;i++,j++) //求平均寻道长度{sum+=abs(cidao[j]-cidao[i]);ave=(float)(sum)/(float)(m);}cout<<endl;cout<<"平均寻道长度:"<<ave<<endl;}/**********************最短寻道时间优先调度算法********************/void SSTF(int cidao[],int m){int k=1;int now,l,r;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";C: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto C;}elsenow=trans(str,a); //输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务{cout<<"磁盘扫描序列为:";for(i=m-1;i>=0;i--)cout<<cidao[i]<<" ";sum=now-cidao[0];}if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<" ";sum=cidao[m-1]-now;}if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者{cout<<"磁盘扫描序列为:";while(cidao[k]<now) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。
{k++;}l=k-1;r=k;while((l>=0)&&(r<m)) //当前磁道在请求序列范围内{if((now-cidao[l])<=(cidao[r]-now)) //选择与当前磁道最近的请求给予服务{cout<<cidao[l]<<" ";sum+=now-cidao[l];now=cidao[l];l=l-1;}else{cout<<cidao[r]<<" ";sum+=cidao[r]-now;now=cidao[r];r=r+1;}}if(l==-1) //磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道 {for(j=r;j<m;j++){cout<<cidao[j]<<" ";}sum+=cidao[m-1]-cidao[0];}else //磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道 {for(j=l;j>=0;j--){cout<<cidao[j]<<" ";}sum+=cidao[m-1]-cidao[0];}}ave=(float)(sum)/(float)(m);cout<<endl;cout<<"平均寻道长度: "<<ave<<endl;}/*****************************扫描调度算法*******************************/void SCAN(int cidao[],int m) //先要给出当前磁道号和移动臂的移动方向{int k=1;int now,l,r,d;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";D: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto D;}elsenow=trans(str,a); //输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=m-1;i>=0;i--)cout<<cidao[i]<<" ";sum=now-cidao[0];}if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<" ";sum=cidao[m-1]-now;}if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者{while(cidao[k]<now){k++;}l=k-1;r=k;cout<<"请输入当前移动臂的移动的方向 (1 表示向外,0表示向内) : ";cin>>d;if(d==0) //选择移动臂方向向内,则先向内扫描{cout<<"磁盘扫描序列为:";for(j=l;j>=0;j--){cout<<cidao[j]<<" "; //输出向内扫描的序列}for(j=r;j<m;j++) //磁头移动到最小号,则改变方向向外扫描未扫描的磁道{cout<<cidao[j]<<" "; //输出向外扫描的序列}sum=now-2*cidao[0]+cidao[m-1];}else //选择移动臂方向向外,则先向外扫描{cout<<"磁盘扫描序列为:";for(j=r;j<m;j++){cout<<cidao[j]<<" "; //输出向外扫描的序列}for(j=l;j>=0;j--) //磁头移动到最大号,则改变方向向内扫描未扫描的磁道{cout<<cidao[j]<<" ";}sum=-now-cidao[0]+2*cidao[m-1];}}ave=(float)(sum)/(float)(m);cout<<endl;cout<<"平均寻道长度: "<<ave<<endl;}/************************循环扫描调度算法*****************************/void CSCAN(int cidao[],int m){int k=1;int now,l,r;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";E: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0)cout<<"输入数据的类型错误,请重新输入!"<<endl;goto E;}elsenow=trans(str,a); //输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<" ";sum=now-2*cidao[0]+cidao[m-1];}if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<" ";sum=cidao[m-1]-now;}if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者{cout<<"磁盘扫描序列为:";while(cidao[k]<now) //单向反复地从内向外扫描{k++;}l=k-1;r=k;for(j=r;j<m;j++){cout<<cidao[j]<<" "; //输出从当前磁道向外扫描的序列 }for(j=0;j<r;j++) //当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道{cout<<cidao[j]<<" ";sum=2*cidao[m-1]+cidao[l]-now-2*cidao[0];}ave=(float)(sum)/(float)(m);cout<<endl;cout<<"平均寻道长度: "<<ave<<endl;}void main(){int a;int c; //菜单项int cidao[maxsize];int i=0,count;char str[100];cout<<"请输入磁道序列(0结束):"<<endl;A:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto A;//输入错误,跳转到A,重新输入}elsecidao[i]=trans(str,a);i++;while(cidao[i-1]!=0){cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0)cout<<"输入数据的类型错误,请重新输入!"<<endl; else{cidao[i]=trans(str,a);i++;}}count=i-1; //要访问的磁道数cout<<"你输入的磁道序列为:";for(i=0;i<count;i++)cout<<cidao[i]<<" "; //输出磁道序列}cout<<endl;while(1){cout<<endl;cout<<"**********************************************"<<endl;cout<<"****** 系统菜单 ******"<<endl;cout<<"**********************************************"<<endl;cout<<"*** ***"<<endl;cout<<"** 1. 先来先服务 **"<<endl;cout<<"*** ***"<<endl;cout<<"**********************************************"<<endl;cout<<"**********************************************"<<endl; G:cout<<"请选择算法:";F:cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto F;//输入错误,跳转到F,重新输入}elsec=trans(str,a);if(c==5)break;if(c>5){cout<<"数据输入错误!请重新输入"<<endl;goto G;}switch(c){case 1: //使用FCFS算法FCFS(cidao,count);break;case 2: //使用SSTF算法SSTF(cidao,count);break;case 3: //使用SCAN算法SCAN(cidao,count);break;case 4: //使用CSCAN算法CSCAN(cidao,count);break;}}}2.1功能说明这一段程序的主要功能为:(1)这是一种比较简单的磁盘调度算法。