操作系统磁盘调度算法课程设计报告书
- 格式:doc
- 大小:385.50 KB
- 文档页数:25
操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。
二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。
常见的磁盘调度算法有:FCFS(先来先服务)、SSTF (最短寻道时间)、SCAN(扫描)、C-SCAN(循环扫描)等。
三、实验过程1.编写代码实现磁盘调度算法首先,我们需要定义一个磁盘请求队列,其中存放所有的IO请求。
然后,根据所选的磁盘调度算法,实现对磁盘请求队列的处理和IO请求的调度。
最后,展示运行结果。
以FCFS算法为例,伪代码如下所示:```diskQueue = new DiskQueue(; // 创建磁盘请求队列while (!diskQueue.isEmpty()request = diskQueue.dequeue(; // 取出队列头的IO请求//处理IO请求displayResult(; // 展示运行结果```2.运行实验并记录数据为了验证各种磁盘调度算法的性能差异,我们可以模拟不同的场景,例如,随机生成一批磁盘IO请求,并使用不同的磁盘调度算法进行处理。
记录每种算法的平均响应时间、平均等待时间等指标。
3.撰写实验报告根据实验数据和结果,撰写实验报告。
实验报告通常包括以下内容:引言、实验目的、实验原理、实验步骤、实验结果、实验分析、结论等。
四、实验结果与分析使用不同的磁盘调度算法对磁盘IO请求进行处理,得到不同的实验结果。
通过对比这些结果,我们可以看出不同算法对磁盘IO性能的影响。
例如,FCFS算法对于请求队列中的请求没有排序,可能会导致一些请求等待时间过长。
而SSTF算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。
五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。
不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。
哈尔滨理工大学课程设计(计算机操作系统)题目:FIFO磁盘调度算法班级:姓名:指导教师:系主任:20XX年03月01日目录555661FIFO磁盘调度算法课程设计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++语言,VS20XX开发环境。
具体采用的技术如下:(1)(2)实现步骤如下:(1)输入磁道序列、当前磁道号(2)FIFO磁盘调度(3)输出平均磁道数运行结果如下:1.5设计结论和心得通过课程设计得到如下结论:(1)本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。
本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。
《操作系统》实验六磁盘调度报告磁盘调度是指操作系统对存储在磁盘中的数据进行管理和调度,以提高磁盘的利用率和系统的性能。
在实验六中,我们将学习和实现几种经典的磁盘调度算法,并通过实验比较它们的性能。
本次实验中,我们实现了以下几种磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯算法(SCAN)和循环扫描(C-SCAN)。
下面将对这几种算法进行具体的介绍和分析。
首先是先来先服务算法(FCFS)。
该算法按照请求的顺序进行磁盘访问,先到达的请求先被服务。
该算法实现简单,但是它无法根据磁盘的物理布局情况进行优化,因此可能出现不连续访问磁盘的情况,导致磁盘的寻道时间增加。
实验结果显示,在磁盘请求序列比较随机的情况下,FCFS算法的性能较差。
第二种算法是最短寻道时间优先算法(SSTF)。
该算法选择与当前磁头位置最近的磁道进行访问,以减少寻道时间。
实验结果显示,SSTF算法在磁盘请求序列比较随机的情况下,相较于FCFS算法,可以有效地减少寻道时间。
然而,当一些磁道频繁被请求时,SSTF算法会优先访问该磁道,导致其他磁道的请求被延迟,出现饥饿现象。
第三种算法是电梯算法(SCAN)。
该算法模拟电梯的运行过程,在一个方向上依次访问磁道,直到到达磁盘的最边缘,然后改变方向继续访问。
实验结果显示,SCAN算法可以很好地优化磁盘访问的顺序,减少寻道时间。
但是,SCAN算法可能导致一些请求在磁盘的一侧永远得不到服务,造成饥饿现象。
最后是循环扫描算法(C-SCAN)。
该算法和SCAN算法类似,不同之处是C-SCAN算法在到达磁盘最边缘后,直接返回到磁道的起始位置继续扫描。
实验结果显示,C-SCAN算法可以减少饥饿现象,但是可能出现磁盘一侧被连续访问导致其他区域的访问不均衡。
综上所述,不同的磁盘调度算法在不同的应用场景下有不同的性能表现。
在磁盘请求序列比较随机的情况下,SSTF算法能够最大程度地减少寻道时间。
第1篇一、实验目的1. 理解磁盘调度算法的基本原理和重要性。
2. 掌握几种常见的磁盘调度算法,包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)算法。
3. 通过模拟实验,分析不同磁盘调度算法的性能差异。
4. 优化磁盘调度策略,提高磁盘访问效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 磁盘调度算法模拟库:PyDiskScheduling三、实验内容1. FCFS算法:模拟实现先来先服务算法,按照请求顺序访问磁盘。
2. SSTF算法:模拟实现最短寻道时间优先算法,优先访问距离当前磁头最近的请求。
3. SCAN算法:模拟实现扫描算法,磁头从0号磁道开始向0号磁道移动,访问所有请求,然后返回到0号磁道。
4. C-SCAN算法:模拟实现循环扫描算法,与SCAN算法类似,但磁头在到达末尾磁道后返回到0号磁道。
四、实验步骤1. 导入PyDiskScheduling库。
2. 创建一个磁盘调度对象,指定磁头初始位置、请求序列和调度算法。
3. 运行调度算法,获取磁头移动轨迹和访问时间。
4. 分析算法性能,包括磁头移动次数、平均访问时间和响应时间等。
五、实验结果与分析1. FCFS算法:在请求序列较短时,FCFS算法表现较好。
但随着请求序列长度增加,磁头移动次数和访问时间明显增加。
2. SSTF算法:SSTF算法在请求序列较短时表现最佳,平均访问时间和响应时间较低。
但当请求序列较长时,算法性能下降,磁头移动次数增加。
3. SCAN算法:SCAN算法在请求序列较短时性能较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。
与SSTF算法相比,SCAN算法在请求序列较长时性能更稳定。
4. C-SCAN算法:C-SCAN算法在请求序列较短时表现较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。
与SCAN算法相比,C-SCAN算法在请求序列较长时性能更稳定,且磁头移动次数更少。
操作系统课程设计报告磁盘调度算法华南农业⼤学数学与信息学院(软件学院)《操作系统分析与设计实习》成绩单开设时间:2015学年第⼀学期⼀、需求分析(1)输⼊的形式和输⼊值的范围:在⽂本框输⼊序列长度,输⼊值为int类型输出每种算法的平均寻道长度。
(3)程序所能达到的功能:模拟实现FCFS、SSTF、SCAN、C-SCAN 算法,并计算及⽐较磁头移动道数。
(4)测试数据:包括正确的输⼊及其输出结果和含有错误的输⼊及其输出结果:⼆、概要设计1)主程序流程图:输出随机⽣成400个磁道号序列主菜单选择算法开始FCFS SSTFSCANC-SCAN 结束(2)各程序模块之间的调⽤关系磁头初始位置输⼊及合法性检查冒泡排序算法由外向内输出磁道序列由内向外输出磁道序列由当前位置向内再向外输出磁道序列由当前位置向外再向内输出磁道序列由当前位置向内再由外向内输出磁道序列由当前位置向外再由内向外输出磁道序列就近选择主函数SCANC-SCAN三、详细设计1)各操作伪码算法(1)实现磁头初始位置的输⼊并进⾏合法性检查int printstarter()//磁头初始位置输⼊{输⼊:磁头初始位置;if输⼊⼩于0或⼤于1500{输出:"输⼊数据类型有误,请重新输⼊!"<重新输⼊}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由最内侧磁道开始{向外依次输出磁道号直到⼩于等于初始位置的磁道的内侧⼀个磁道;当前磁道号与磁头初始未⾄的绝对值求和;}返回绝对值之和;{找到⼤于磁头初始位置的磁道;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 磁头初始位置为中间值{调⽤就近选择算法;}求均值;输出平均寻道时间;}输⼊:磁臂移动⽅向(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 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)通过对每⼀⾏的输出设置断点判断问题出现在哪⾥,把出问题的地⽅缩⼩到⼀定范围,然后解决问题,如若解决不出则上⽹查询。
SSTF磁盘调度算法操作系统课程设计报告_(2)哈尔滨理工大学课程设计(课程名称)题目: SSTF磁盘调度算法班级:姓名:指导教师:系主任:2014年03月01日目录1SSTF磁盘调度算法课程设计 01.1 题目分析 01.2 数据结构 01.3 流程图 (1)1.4 实现技术 (2)1.5 设计结论和心得 (3)2 Linux代码分析 (5)2.1 功能说明 (7)2.2 接口说明 (7)2.3 局部数据结构 (7)2.4 流程图 (8)2.5 以实例说明运行过程 (8)- -1SSTF磁盘调度算法课程设计1.1题目分析SSTF磁盘调度算法问题是操作系统中的一个重要问题。
主要要求访问的磁道与当前磁头所在磁道距离最近,以使每次的寻道时间最短。
故SSTF较之FCFS有更好的寻道性能。
1.2数据结构SSTF磁盘调度算法问题中涉及的数据结构是定义数组str[],存放输入的数据,用str[i]表示输入第i+1个数据,数组cidao[]和str[]意义一样。
全局变量n,表示磁道的最大个数,now表示当前磁道号,全局变量sum和ave,表示总的寻道时间和平均寻道长度。
用变量i和j,表示第i+1和j+1磁道,变量k表示任意磁道,变量d表示选择移动的方向,有两个取值 1表示向外,0表示向内。
用伪代码表示如下:int scan(Linklist L,int Current){LNode *p,*q,*s;float sum=0;if(L->next!=NULL){p=L->next;while(p->data<Currrentp=p->next;}用主要代码表示如下:Now=printnow(0;if(cidao[m-i]<=now)sum=printout(cidao,now,m);if(cidao[0]>=now) sum=printin(cidao,now,m);if(now>cidao[0]@@now<cidao[m-i]){Count<<”磁盘扫描序列为:”;While(cidao[k]<now){k+1;} i=k-1; r=k;While (i>=0)&&(r<m)){if(now-cidao[i]<=(cidao[r]-now))Sum=prints(cidao,now,m,i,r);Else sum=printl(cidao,now,m,i,r) 1.3流程图1.4实现技术为实现上述设计,采用C++语言,VS2008开发环境。
《计算操作系统》课程设计报告姓名:崔玲玲班级:软件111学号:201101014103指导老师:夏辉丽目录1. 操作系统课程设计任务描述 (1)1.1先来先服务算法(FCFS) (1)1.2最短寻道时间优先算法(SSTF) (1)1.3扫描算法(SCAN) (1)1.4循环扫描算法(CSCAN) (1)2. 问题定义与需求分析 (2)2.1 输入的形式 (2)2.2 输入值的范围 (2)2.3输出的形式 (2)2.4程序所能达到的功能 (2)2.5测试数据 (2)3. 概要设计及流程图 (3)3.1子模块的调用关系 (3)3.2个别函数的参数 (3)3.3主要的流程图 (3)4. 问题实现及代码 (5)4.1先来先服务算法的实现 (5)4.2最短寻道时间优先算法的实现 (6)4.3扫描算法的实现 (7)4.4循环扫描算法的实现 (7)5. 调试分析 (9)6. 测试 (9)6.1测试数据 (9)6.2测试界面 (10)7. 课设总结 (12)8. 参考文献 (13)9. 源代码 (14)1. 操作系统课程设计任务描述本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法。
1.1先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法,它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
1.2最短寻道时间优先算法(SSTF)该算法要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短,对用户的服务请求的响应机会不是均等的。
1.3扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
题目:磁盘调动一.设计目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,经过课程设计,我们更好地掌握操作系统的原理及实现方法 , 加深对操作系统基础理论和重要算法的理解,增强了着手能力。
二.课程设计内容和要求编程序实现下述磁盘调动算法 , 并求出每种算法的均匀寻道长度,要求设计主界面以灵巧选择某算法,且以下算法都要实现:1、先来先服务算法( FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法( SCAN)4、循环扫描算法( CSCAN)三.算法及数据构造3.1 算法的整体思想设施的动向分派算法与进度调动相像,也是鉴于必定的分派策略的。
常用的分派策略有先恳求先分派、优先级高者先分派等策略。
在多道程序系统中,低效率往常是因为磁盘类旋转设施使用不妥造成的。
操作系统中,对磁盘的接见要求来自多方面,经常需要排队。
这时,对众多的接见要求按必定的序次响应,会直接影响磁盘的工作效率,从而影响系统的性能。
接见磁盘的时间因子由3 部分组成,它们是查找(查找磁道)时间、等候(旋转等候扇区)时间和数据传输时间,此中查找时间是决定要素。
所以,磁盘调动算法先考虑优化查找策略,需要时再优化旋转等候策略。
均匀寻道长度( L)为全部磁道所需挪动距离之和除以总的所需接见的磁道数( N),即:L=(M1+M2+ +Mi++MN)/N此中 Mi 为所需接见的磁道号所需挪动的磁道数。
启动磁盘履行输入输出操作时,要把挪动臂挪动到指定的柱面,再等候指定扇区的旋转到磁头地点下,而后让指定的磁头进行读写,达成信息传递。
所以,履行一次输入输出所花的时间有:找寻时间——磁头在挪动臂带动下挪动到指定柱面所花的时间。
延缓时间——指定扇区旋转到磁头下所需的时间。
传递时间——由磁头进度读写达成信息传递的时间。
此中传递信息所花的时间,是在硬件设计就固定的。
而找寻时间和延缓时间是与信息在磁盘上的地点相关。
为了减少挪动臂进行挪动花销的时间,每个文件的信息不是按盘面上的磁道次序寄存满一个盘面后,再放到下一个盘面上。
操作系统实验报告实验六磁盘调度算法班级:学号:姓名:一、需求分析1、实验目的:通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。
2、问题描述:设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。
假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
3、程序要求:1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN 和循环SCAN算法模拟磁道访问过程。
2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。
3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
4)输出:每种算法的平均寻道长度。
二、概要设计1、程序中的变量及数据结构的定义a) 自定义的整型向量类型:typedef vector<int> vInt;b) 磁道的结构体:struct OrderItem{int Data; //磁道号bool IsVisited;//磁道是否已被访问};c) 磁道序列类型:typedef vector<OrderItem> Order;d) 存储待访问磁道序列:Order InitOrder;e) 存储已被访问的磁道序列:vInt TrackOrder;f) 移动距离序列:vInt MoveDistance;g) 平均寻道长度:double AverageDistance;2、主要函数说明a)获取用户输入的磁盘个数和磁盘的访问序列:void InitDate(int &num);参数num为磁道个数b)先来先服务算法:void FCFS(int disk);c)最短寻道时间优先算法:void SSTF(int disk);d)扫描算法:void SCAN(int disk);e)循环扫描算法:void CSCAN(int disk);f)void Show(int disk);3、主函数的流程三、详细设计1.FCFS算法a)说明:根据进程请求访问磁盘的先后次序进行调度。
课程设计课程设计名称:操作系统应用课程设计专业班级:学生姓名:xxxxx学号:指导教师:课程设计时间: 2010.12.20-2010.12.26计算机科学专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页一 .课程设计需求分析操作系统是计算机系统的一个重要系统软件。
我们在本课程的实验过程中,了解实际操作系统的工作过程,在实践中加深对操作系统原理的理解。
磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取,是当前存放大量程序和数据的理想设备,故在现代计算机系统中,都配置了磁盘存储器,并以它为主来存放文件。
这样,对文件的操作,都将涉及到对磁盘的访问。
磁盘I/O速度的高低和磁盘系统的可靠性都将直接影响到系统性能。
因此,设法改善磁盘系统的性能,已成为现代操作系统的重要任务之一。
磁盘性能有数据的组织、磁盘的类型和访问时间等。
磁盘调度的目标是使磁盘的平均寻道时间最少。
也正因为这样,我们有必要对各算法进行模拟,进而比较、分析、了解。
本实验设计的目的是通过设计一个磁盘调度模拟系统,以加深对最短寻道时间优先(SSTF)、N步扫描算法(NStepSCAN)等磁盘调度算法的理解。
让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二.课程设计原理设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
目录目录 (1)1.课程设计目的 (2)1.1编写目的 (2)2.课程设计容 (2)2.1设计容 (2)3.课程设计方案 (3)3.1模块划分 (3)3.2模块调用关系图 (6)3.3子模块程序流程图 (6)4.测试数据和结果 (10)4.1测试数据 (10)4.2测试结果 (11)4.3测试抓图 (11)5.参考文献 (14)6.总结 (15)6.1设计体会 (15)6.2结束语 (15)7.程序使用说明书 (15)8.程序源代码 (15)1.课程设计目的1.1编写目的本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。
2.课程设计容2.1设计容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
1、先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2、最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
3、扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
4、循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。
如果对磁道的访问请均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
3.课程设计方案3.1模块划分本系统划分为四个模块:先来先服务算法模块void FCFS(int array[],int m)、最短寻道时间优先算法模块void SSTF(int array[],int m)、扫描算法模块void SCAN(int array[],int m)和循环扫描算法模块:void CSCAN(int array[],int m)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);}2 最短寻道时间优先算法模块:void SSTF(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序的磁道序列,输入当前磁道号,根据前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。
主要代码:for(i=0;i<m;i++) /*使用冒泡法按从小到大顺序排列*/for(j=i+1;j<m;j++){if(array[i]>array[j]){temp=array[i];array[i]=array[j];array[j]=temp;}}if(array[m-1]<=now) /*若当前磁道号大于请求序列中最大者,则直接由外向依次给予各请求服务*/{for(i=m-1;i>=0;i--)cout<<array[i]<<" ";sum=now-array[0];}elseif(array[0]>=now) /*若当前磁道号小于请求序列中最小者,则直接由向外依次给予各请求服务*/while((l>=0)&&(r<m)) /*当前磁道在请求序列围*/{if((now-array[l])<=(array[r]-now)) /*选择与当前磁道最近的请求给予服务*/{cout<<array[l]<<" ";sum+=now-array[l];now=array[l];l=l-1;}3 扫描算法模块:void SCAN(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序的序列,输入当前磁道号,选择移动臂的移动方向,根据当前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。
主要代码:if(d==0) /*选择移动臂方向向,则先向扫描*/{for(j=l;j>=0;j--){cout<<array[j]<<" "; /*输出向扫描的序列*/}for(j=r;j<m;j++) /*磁头移动到最小号,则改变方向向外扫描未扫描的磁道*/{cout<<array[j]<<" "; /*输出向外扫描的序列*/}sum=now-2*array[0]+array[m-1];}else /*选择移动臂方向向外,则先向外扫描*/{for(j=r;j<m;j++){cout<<array[j]<<" "; /*输出向外扫描的序列*、}for(j=l;j>=0;j--) /*磁头移动到最大号,则改变方向向扫描未扫描的磁道*/{cout<<array[j]<<" ";}sum=-now-array[0]+2*array[m-1];}}ave=(float)(sum)/(float)(m);4 循环扫描算法模块:void CSCAN(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序的序列,输入当前磁道号,规定移动臂单向反复的从向外移动,根据当前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。
主要代码:if(array[m-1]<=now) /*若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务*/{for(i=0;i<m;i++)cout<<array[i]<<" ";sum=now-2*array[0]+array[m-1];}elseif(array[0]>=now) /*若当前磁道号小于请求序列中最小者,则直接由向外依次给予各请求服务,此情况同最短寻道优先*/{for(i=0;i<m;i++)cout<<array[i]<<" ";sum=array[m-1]-now;}for(j=0;j<r;j++) /*当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道*/{cout<<array[j]<<" ";}sum=2*array[m-1]-now;}ave=(float)(sum)/(float)(m);3.2模块调用关系图3.3子模块程序流程图FCFS算法流程图:SSTF算法流程图:SCAN算法流程图:4.测试数据和结果4.1测试数据1 先来先服务算法输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1002 最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:200(2)当前磁道号小于磁道序列中的最小的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:0(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1003 扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:200(2)当前磁道号小于磁道序列中的最小的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:0(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:100(4)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向)时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1004 循环扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:200(2)当前磁道号小于磁道序列中的最小的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:0(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1004.2测试结果1 先来先服务算法平均寻道长度:55.32 最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时平均寻道长度:20.2(2)当前磁道号小于磁道序列中的最小的磁道号时平均寻道长度:27.5(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时平均寻道长度:20.43 扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时平均寻道长度:20.2(2)当前磁道号小于磁道序列中的最小的磁道号时平均寻道长度:27.8(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时平均寻道长度:27.5(4)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向)时平均寻道长度:20.44 循环扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时平均寻道长度:38.6(2)当前磁道号小于磁道序列中的最小的磁道号时平均寻道长度:35.8(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时平均寻道长度:20.44.3测试抓图1输入磁道序列(0结束):55 58 39 18 90 160 150 38 184,输出序列:2 选择先来先服务算法,得出结果:3 选择最短寻道时间优先算法,输入当前磁道号100,得出结果:4 选择扫描算法,输入当前磁道号100,选择向外移动,得出结果:5 选择扫描算法,输入当前磁道号100,选择向移动,得出结果:6 选择循环扫描算法,输入当前磁道号100,得出结果:7 选择退出:5.参考文献《计算机操作系统(修订版)》汤子瀛电子科技大学《操作系统教程》方敏编电子科技大学《操作系统实用教程(第二版)》任爱华清华大学《操作系统原理与实践教程》周湘贞、曾宪权清华《程序设计基础教程》家骏机械工业6.总结6.1设计体会本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。