模拟磁盘调度算法,操作系统课程设计

合集下载

操作系统课程设计磁盘调度报告

操作系统课程设计磁盘调度报告

题目:磁盘调度一.设计目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手能力。

二.课程设计内容和要求编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵活选择某算法,且以下算法都要实现:1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)三.算法及数据结构3.1算法的总体思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。

常用的分配策略有先请求先分配、优先级高者先分配等策略。

在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。

操作系统中,对磁盘的访问要求来自多方面,常常需要排队。

这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。

访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。

因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。

平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。

启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。

因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。

延迟时间——指定扇区旋转到磁头下所需的时间。

传送时间——由磁头进程读写完成信息传送的时间。

其中传送信息所花的时间,是在硬件设计就固定的。

而寻找时间和延迟时间是与信息在磁盘上的位置有关。

为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。

操作系统课程设计--模拟实现磁盘的调度

操作系统课程设计--模拟实现磁盘的调度

课程设计设计题目:模拟实现磁盘的调度一、课题设计目的a、观察、体会操作系统的磁盘调度方法,并通过一个简单的磁盘调度模拟程序的实现,加深对磁盘调度的理解。

b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。

c、通过对磁盘调度算法的设计,深入理解提高磁盘访问速度的原理。

二、课题实现环境VC++6.0 MFC三、课题设计思路算法描述:1.服务算法(FCFS)先来先服务(FCFS)调度:按先来后到次序服务,未作优化。

最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。

例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。

采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。

先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。

2.算法(SCAN)SCAN 算法又称电梯调度算法。

SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。

“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。

这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客陈生、伍生、张生在等候乘电梯。

他们的要求是:陈生在2层等待去10层;伍生在5层等待去底层;张生在8层等待15层。

由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张生从8层带到15层,然后电梯换成下行方向,把乘客伍生从5层带到底层,电梯最后再调换方向,把乘客陈生从2层送到10层。

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

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

序止之阳早格格创做纲要:本课程安排的脚段是通过安排一个磁盘调动模拟系统,进而使磁盘调动算法越收局里化,使磁盘调动的特性更简朴明白,那里主要真止磁盘调动的四种算法,分别是:1、先去先服务算法(FCFS)2、最短觅道时间劣先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN). 开用磁盘真止输进输出支配时,要把移动臂移动到指定的柱里,再等待指定扇区的转动到磁头位子下,而后让指定的磁头举止读写,完毕疑息传递;果此,真止一次输进输出所花的时间有:觅找时间——磁头正在移动臂戴动下移动到指定柱里所花的时间. 延缓时间——指定扇区转动到磁头下所需的时间. 传递时间——由磁头进程读写完毕疑息传递的时间,觅道时间——指估计机正在收出一个觅址下令,到相映目标数据被找到所需时间;其中传递疑息所花的时间,是正在硬件安排时牢固的,而觅找时间战延缓时间是与疑息正在磁盘上的位子有关;而后安排出磁盘调动的安排办法,包罗算法思路、步调,以及要用到的主要数据结构、函数模块及其之间的调用关系等,并给出仔细的算法安排,对付编码举止了尝试与分解. 末尾举止部分归纳与安排体验.关键词汇:最短觅道时间劣先算法、扫描算法、总觅道少度.目录前止22. 课程安排任务及央供42.1 安排任务42.2 安排央供43. 算法及数据结构53.1算法的总体思维(过程)53.2 真止历程中用到的数据结构63.3 真止历程中用到的系统调用114. 步调安排与真止114.1 最短觅道时间劣先算法(SSTF)模块114.1.2 步调证明134.1.3 步调关键代码134.2扫描算法(SCAN)模块144.2.1 步调过程图144.2.2 步调证明164.2.3 步调关键代码164.3 真验截止175. 论断266. 参照文献267. 支获、体验战提议272. 课程安排任务及央供2.1 安排任务1.认识并掌握磁盘调动算法管制系统的安排要领,加强对付所教百般调动算法及相映算法的特性相识.2.掌握磁盘调动的基础观念,深刻体验各个算法的劣缺面,以及算法间的相似面.2.2 安排央供1)定义与算法相关的数据结构,如PCB、行列等;2)真止2种分歧的调动算法(可使用真代码大概过程图举止分解);3)算法真止中断时,应给出总的觅道少度;4)磁道考察序列随机死成,且要谦脚一定的数量央供(很多于100个);5)系统真止必须提供一定的接互性,所需尝试数据应当以文献形式提供大概者由用户正在尝试历程中给出,不可将尝试数据“写死”正在系统真止代码中;6)必须给出脚够的注释,注释量不得少于代码量的一半;7)对付于系统中所使用到的系统调用(API函数),必须给出函数的定义本型、使用要领,参数较为搀纯的,还该当给出参数的简曲形貌;3. 算法及数据结构3.1算法的总体思维(过程)图a SSTF 调动算法示例图用冒泡法对付磁道数组举止排序 返回内侧(中侧)扫描 图b SSTF 算法过程示例图 本磁道号随机组成的数组:cidao[]={55,58,39,18,90,160,150,38,184}; 排序后的数组={18,38,39,5,58,90,150,160,184};输进目前磁道号:now=100;ciidao[]={55,58,39,18,90,160,150,38,184}(可随机死成多个)用户输进目前磁道号now ,比较目前磁道到每个磁道的移动距离,采用最短距离的磁道举止移动.now 指背目前磁道号,将目前磁道号与结余不考察的磁道号举止比较,沉复上述支配.并估计仄衡觅道少度ave.3839 3955 55 5558 58 58 5890 90 90 90 90now值:100 90 58 55 39184160 160150 150 15018 18 18 1838 38 38 3839 39 39 3955 55 55 5558 58 58 5890 90 90 90now值:18 150 160 184图c SSTF算法行列示企图(按磁道考察程序)2.扫描(SCAN)算法图d SCAN算法示例图本磁道号随机组成的数组:cidao[]={55,58,39,18,90,160,150,38,184};排序后的数组={18,38,39,5,58,90,150,160,184};输进目前磁道号:now=100;采用磁道移动目标;以磁道号减少的目标移动为例:5558 5890 90 90184 184 184 184160 160 160 160 160150 150 150 150 150 150now值:100 150 160 184 90 581838 3839 39 3955 55 5558 58 5890 90 90184 184 184160 160 160150 150 150now值:55 39 38图e SCAN算法行列示企图(按磁道考察程序)3.3 真止历程中用到的系统调用系统模块调用关系图4.4.14.1.2①最短②100号柱里上真的柱里为90真止支配的序次时,读写磁头总合移动多个柱里的距离,与先去先服务、算法比较,大幅度天缩小了觅找时间,具备更佳的觅道本能,果而支缩了为各考察者哀供服务的仄衡时间,也便普及了系统效用.但是最短查找时间劣先(SSTF)调动,FCFS 会引起读写头正在盘里上的大范畴移动,SSTF查找距离磁头最短(也便是查找时间最短)的哀供动做下一次服务的对付象.SSTF查找模式有下度局部化的倾背,会推早一些哀供的服务,以至引起无限缓慢(又称饥饥).算法过程:输进磁头初初磁道号,序列少度,磁道号序列.采用磁盘调动算法(最短觅道时间劣先调动(SSTF))大概(扫描调动算法(SCAN))中的任性一个,若采用SSTF,则输出各进程被调动的程序,并估计总的觅道少度战仄衡觅道少度,采用关关则中断磁盘调动.4.1.3 步调关键代码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;}扫描算法(SCAN )模块4.2.1 步调过程图4.2.2 ①消了SSTF ②SCAN 法.3位搭客弛10层;弛二正在55.那里是:100号柱里的③SCAN 4.2.3 if {for {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.3真验截止运止界里截图及相映代码1.主界里void display(){cout<<"\n\n\n\n Operating Systems Curriculum Design\n";cout<<"\n ╔———————————————————————————————╗"; cout<<"\n ││";cout<<"\n │称呼: 磁盘调动│"; cout<<"\n ││";cout<<"\n │工具: Visual Studio 2010 │"; cout<<"\n ││";cout<<"\n │班级:1205 │"; cout<<"\n ││";cout<<"\n │做家:施静│"; cout<<"\n ││";cout<<"\n │教号:211214020 │"; cout<<"\n ││";cout<<"\n ╚———————————————————————————————╝\n"; system("pause");system("cls");2.序止提示用户此步调真止的算法cout<<"【载进完毕】"<<endl<<endl;cout<<" 序止"<<endl<<endl;cout<<" 欢迎使用『磁盘调动算法系统』,本步调真止了时常使用的磁盘调动算法如下所示:\n\n";cout<<" ①最短觅道时间劣先(SSTF):最短觅道时间劣先算法央供考察的磁盘与目前磁头天圆的\n";cout<<" 磁盘距离迩去,以使屡屡的觅道时间最短.\n\n";cout<<" ②扫描算法(SCAN)电梯调动:扫描算法不但是思量到欲考察的磁道与目前磁道的距离\n";cout<<" 更劣先思量的是磁头的目前移动目标.\n\n";system("pause");system("cls");//浑屏3.用户采用所使用的算法(先随机死成101个磁道号)void showMenu(int cidao[],int n){int choice;while(true){cout<<"请您采用喜欢的算法去真止调动(输进1-3):";cout<<"\n ╔—————————————╗"; cout<<"\n ││";cout<<"\n │ 1.最短觅道时间劣先(SSTF) |"; cout<<"\n ││";cout<<"\n │ 2.扫描算法(SCAN) │"; cout<<"\n ││";cout<<"\n │ 3.退出(EXIT) │"; cout<<"\n ││";cout<<"\n ╚—————————————╝\n"; cout<<endl;while(true){cout<<"目前您采用的算法号是(1-3):";cin>>choice;switch(choice){ /*case 1:FCFS(a,n);break;*/case 1:SSTF(cidao,n);break;case 2:SCAN(cidao,n);break;case 3:cout<<"\n要退出系统了欢迎使用本系统\n";exit(0);}}}}4.最短觅道时间劣先算法/**********************最短觅道时间劣先调动算法********************/ void SSTF(int cidao[],int m){system("cls");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<<"总的觅道少度: "<<sum<<endl;cout<<"仄衡觅道少度: "<<ave<<endl;cout<<"请按任性键返回系统菜单"<<endl;getch();showMenu(cidao,m); //回到主界里}最短觅道时间劣先(SSTF)算法真止界里(2)扫描(SCAN)算法/*****************************扫描调动算法*******************************/ void SCAN(int cidao[],int n)//先要给出目前磁道号战移动臂的移动目标{int temp;int i,j;int now;int sum;for(i=0;i<n;i++) //给磁道号排序for(j=i+1;j<n;j++){if(cidao[i]>cidao[j]){temp=cidao[i];cidao[i]=cidao[j];cidao[j]=temp;}}cout<<"\n按非递减程序排列佳的磁道: \n";for(i=0;i<n;i++) //输出排佳序的磁道号cout<<cidao[i]<<" ";cout<<endl;cout<<"\n请输进目前的磁道号: ";cin>>now; //用户自定义目前磁道号if(cidao[n-1]<=now){for(i=n-1;i>=0;i--)cout<<cidao[i]<<" ";sum=now-cidao[0];}else//cidao[n-1]>nowif(cidao[0]>=now){for(i=0;i<n;i++)cout<<cidao[i]<<" ";sum=cidao[n-1]-now;}else//cidao[0]<now && cidao[n-1]>now{int pointer;int location=1;int left,right;while(cidao[location]<now)location++;left=location-1;right=location;cout<<"\n请输进目前磁头念要移动的目标(1 磁道号减少目标,0 磁道号减小目标): "; loop:cin>>pointer;cout<<"\n磁盘调动程序为: \n";if(pointer==0 || pointer==1){if(pointer==0)//磁头背左移动到最小号,再改变目标背中扫描已扫描的磁道{for(j=left;j>=0;j--)cout<<cidao[j]<<" ";for(j=right;j<n;j++)cout<<cidao[j]<<" ";sum=now+cidao[n-1]-2*cidao[0];cout<<endl;}if(pointer==1)//磁头背左移动到最大号,再改变目标背内扫描已扫描的磁道{for(j=right;j<n;j++)cout<<cidao[j]<<" ";for(j=left;j>=0;j--)cout<<cidao[j]<<" ";sum=2*cidao[n-1]-now-cidao[0];//供总觅道少度cout<<endl;}}else{cout<<"\n输进分歧法!!请输进0大概1:\n"; goto loop;}}cout<<"\n\n需要移动的总磁道数为: "<<sum<<endl; cout<<"请按任性键返回系统菜单"<<endl;getch();showMenu(cidao,n); //回到主界里5.论断(1)用户界里友佳,采与了采用菜单模式,用户只需按“回车键”即可再现主界里;结构浑晰,支配简朴易懂,界里浑爽整净;(2)统制变量对付比,各磁盘调动算法均对付共一组随机磁道号举止调动,但是本去不会改变随机磁道真质,包管了仄衡觅道少度对付比的真正在性、灵验性. (3)百般算法皆有便宜,也各有缺累,需要权衡利弊,使用才搞达到最佳的效验.6.参照文献《估计机支配系统(建订版)》汤子瀛西安电子科技大教出版社《支配系统教程》圆敏编西安电子科技大教出版社《数据结构(C++版)》王白梅、胡明、王涛编著浑华大教出版社7.支获、体验战提议正在搞本次课程安排之前,对付于磁盘调动,尔真足不观念.通过齐力以及分离教授之前道的真质,尔毕竟深刻明白了磁盘调动算法的内涵.正在钻研自己所选的二种算法的共时,对付磁盘调动的四种算法——先去先服务算法(FCFS)、最短觅道时间劣先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)皆有了更深刻的明白战掌握,使尔不妨为磁盘调动采用适合的算法,普及CPU处事效用.安排历程中逢到的艰易正在教授战共教的助闲下乐成办理并通过了查支,尔深刻认识到算法的逻辑性对付步调的要害做用,算法的准确度对付步调运止截止的要害做用,那对付尔以去正在支配系统的教习中有极大助闲.每一次的课程安排皆是对付自己之前所教知识的加强,是一次罕见的教习机会.正在课程安排的每一个步调、每一段代码的真止,皆要反复去斟酌,反复运止调试,一面面的小偏偏好皆市引导波折.果为乐成阻挡易,所以当调试板上隐现“死成乐成”时,谦背的成便感是不问可知的.通过自己的动脚动脑,不但是减少了知识,还给了尔博业知识以及博业技能上的提下,对付普及自己的思维本领战支配本领也有很大的助闲.共时尔也会越收有自疑心,越收齐力,严肃教习,争与正在以去的课程中搞得更佳!。

推荐-FIFO磁盘调度算法操作系统课程设计报告1 精品

推荐-FIFO磁盘调度算法操作系统课程设计报告1 精品

哈尔滨理工大学课程设计(计算机操作系统)题目: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状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。

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

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

操作系统课程设计报告磁盘调度算法华南农业⼤学数学与信息学院(软件学院)《操作系统分析与设计实习》成绩单开设时间: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)通过对每⼀⾏的输出设置断点判断问题出现在哪⾥,把出问题的地⽅缩⼩到⼀定范围,然后解决问题,如若解决不出则上⽹查询。

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

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

某某大学课程设计报告课程名称:操作系统设计题目:系别:专业:模拟磁盘调换算法计算机系计算机科学与技术组别:学生姓名:学号 :起止日期:指导教师:目录第一章需求解析 (1)1.1 课程设计的简介 (1)1.2 课程设计的目的 (1)1.3 磁盘调换主要思想 (1)1.4 课程设计内容 (2)第二章大纲设计 (3)2.1 设计思想 (3)数据结构 (3)2.3 模块调用关系图 (3)2.4 子模块程序流程图 (5)第三章详细设计 (6)3.1 模块划分 (6)第四章代码测试 (9)4.1 先来先服务 (9)4.1 最短寻道时间优先 (11)4.1 扫描算法 (12)第五章心得领悟 (13)第六章致谢 (13)参照文件 (13)附源代码 (1)第一章需求解析1.1 程的介是一个用VC++6.0 工具、 C++程言而模先来先服算法(FCFS)、最短道先算法( SSTF)、描算法( SCAN)的一个磁度程序。

程序系主界面能够灵便某种算法并算出磁移的磁道数以及平均磁道数。

1.2程的目的本程的目的是通一个磁度模系,从而使磁度算法更加形象化,简单令人理解,使磁度的特点更了然,能使使用者加深先来先服算法( FCFS)、最短道先算法( SSTF)、描算法( SCAN)等磁度算法的理解。

1.3 磁度主要思想的分配算法与程度相似,也是基于必然的分配策略的。

常用的分配策略有先求先分配、先高者先分配等策略。

在多道程序系中,低效率平时是由于磁旋使用不当造成的。

操作系中,磁的要求来自多方面,常常需要排。

,众多的要求按必然的次序响,会直接影响磁的工作效率,而影响系的性能。

磁的因子由 3 部分组成,它是找(找磁道)、等待(旋等待扇区)和数据,其中找是决定因素。

所以,磁度算法先考化找策略,需要再化旋等待策略。

平均道度( L)所有磁道所需移距离之和除以的所需的磁道数(N),即: L= (M1+M2+⋯⋯ +Mi+⋯⋯ +MN)/N 。

磁盘驱动调度算法

磁盘驱动调度算法

操作系统课程设计题目:磁盘驱动调度算法模拟班级:姓名:学号:指导教师:成绩:6 月磁盘驱动调度算法模拟菜单显示FCFS算法SCAN算法SSTF算法CSCAN算法沿磁道增加方向沿磁道减小方向沿磁道增加方向沿磁道减小方向一、课程设计目的1.进一步加深对磁盘驱动调度算法的理解。

2.编程实现“先来先服务”、“最短寻道时间优先”、“电梯调度”、“循环扫描”算法。

二、课题内容1.假设一种磁盘含有4 个盘片,每个盘片有100 个磁道,每道有8 个扇区,模拟格式化时对柱面和扇区进行编号的过程。

2.设计若干磁道访问请求,规定顾客输入线性块号,系统能将其转换为对应的磁道号(柱面号),并计算出分别采用“先来先服务”、“最短寻道时间优先”、“电梯调度”、“循环扫描”算法的寻道总长度。

3.提供可视化且简洁清晰的顾客界面,能直观且动态地描述磁头移动。

三、设计思路(一)系统概要设计1.整体模块设计图2.有关知识磁盘调度:当有多个进程都请求访问磁盘时,采用一种合适的驱动调度算法,使各进程对磁盘的平均访问(重要是寻道)时间最小。

现在惯用的磁盘调度算法有:1)先来先服务2)最短寻道时间优先3)扫描算法4)循环扫描算法等3.算法思想介绍(1)先来先服务算法(FCFS)即先来的请求先被响应。

FCFS 方略看起来似乎是相称"公平"的,但是当请求的频率过高的时候FCFS 方略的响应时间就会大大延长。

FCFS 方略为我们建立起一种随机访问机制的模型,但是如果用这个方略重复响应从里到外的请求,那么将会消耗大量的时间。

为了尽量减少寻道时间,看来我们需要对等待着的请求进行合适的排序,而不是简朴的使用FCFS 方略。

这个过程就叫做磁盘调度管理。

有时候FCFS 也被看作是最简朴的磁盘调度算法。

(2)最短寻道时间优先算法(SSTF)最短时间优先算法选择这样的进程。

规定访问的磁道,与现在磁头所在的磁道距离近来,以使每次的寻道时间最短。

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

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

《计算操作系统》课程设计报告姓名:崔玲玲班级:软件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)1.1 课程设计的简介 (1)1.2 课程设计的目的 (1)1.3 磁盘调度主要思想 (1)1.4 课程设计内容 (2)第二章概要设计 (3)2.1 设计思想 (3)2.2 数据结构 (3)2.3 模块调用关系图 (3)2.4 子模块程序流程图 (5)第三章详细设计 (6)3.1 模块划分 (6)第四章代码测试 (9)4.1 先来先服务 (9)4.1 最短寻道时间优先 (11)4.1 扫描算法 (12)第五章心得体会 (13)第六章致谢 (13)参考文献 (13)附源代码 (1)第一章需求分析1.1 课程设计的简介这是一个用VC++6.0为工具、C++为编程语言而实现模拟先来先服务算法(FCFS、最短寻道时间优先算法(SSTF、扫描算法(SCAN的一个磁盘调度程序。

该程序设计系统主界面可以灵活选择某种算法并算出磁头移动的总磁道数以及平均磁道数。

1.2 课程设计的目的本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法(FCFS、最短寻道时间优先算法(SSTF、扫描算法(SCAN等磁盘调度算法的理解。

模拟磁盘调度算法系统的设计毕业设计【范本模板】

模拟磁盘调度算法系统的设计毕业设计【范本模板】

目录一、设计任务及主要技术 (3)二、设计方案及论证结果 (4)三、系统的原理框图 (5)四、设计程序 (12)五、实验结果 (20)六、调试分析及故障处理 (24)七、设计结论 (25)八、心得体会 (26)一、设计任务及主要技术1.整体功能概述(设计任务):磁盘是外设中一个很常用的部分,所以,对磁盘数据的寻道时间的长短可以直接影响机器的整体运行速度的快慢.本设计为一个模拟磁盘调度算法的磁盘调度模拟系统,能够模拟先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法、环形扫描(C_SCAN)算法及N_SCAN算法五个磁盘调度算法,输入为一组作业的磁道请求,输出为按选择的算法执行时的磁头移动轨迹.其中,先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法为基本算法,环形扫描(C_SCAN)算法及N_SCAN算法为扩展算法。

2.运行环境:(1)硬件环境Intel core i5 CPU(2)软件环境Windows 7 Microsoft Visual C++ 6。

03.主要技术:(1)用C语言编写程序;(2)对编程软件Microsoft Visual C++ 6。

0的了解和使用;(3)操作系统基础知识(主要是对先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法的了解);(4)操作系统扩展知识(通过网络自学环形扫描(C_SCAN)算法及N_SCAN算法)。

二、设计方案及论证结果1.设计方案:(1)先来先服务算法(First—Come,First—Served,FCFS)此算法为一种最简单的磁盘调度算法。

它直接根据作业请求磁盘的先后顺序对磁盘进行寻访。

此算法公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况。

但此算法未对寻道方案进行优化,故平均周转时间及带权周转时间都会较长。

(2)最短寻道时间优先算法(Shortest Seek Time First,SSTF)此算法优先选择距离当前磁头位置最近的作业磁道请求。

操作系统课设报告磁盘调度算法

操作系统课设报告磁盘调度算法

课程设计报告课程名称: 操作系统课程设计课题名称: 磁盘调度算法学院: 软件学院班级:学生姓名:学号:指导教师:磁盘调度算法一、系统需求分析磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取,是当前存放大量程序和数据的理想设备。

所以在现代计算机中都配备了磁盘存储器,以他为主存放文件,这样对文件的读、写操作都涉及到了对磁盘存储器的访问。

磁盘I/O速度的高低和磁盘系统的可靠性,都直接影响到系统的性能。

因此改善磁盘系统的性能成为现代操作系统的重要任务之一。

磁盘性能有数据的组织、磁盘的类型和访问时间等。

可以通过选择好的磁盘调度算法,以减少磁盘的寻道时间。

为了减少对文件的访问时间,应采用一种最佳的磁盘调度算法,以使各进程对磁盘的平均访问时间最少。

由于在访问磁盘的时间中主要是寻道时间,因此,磁盘调度的目标是使磁盘的寻道时间最少。

所以本课程设计对各个算法进行模拟,进而比较分析了解。

二、实验内容和目的2.1.实验内容模拟电梯调度算法,实现对磁盘的驱动调度。

设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)2.2.实验原理模拟电梯调度算法,对磁盘调度。

磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。

当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。

三、总体设计及分类简介3.1算法介绍磁盘调度中常用的有四种算法,功能分别如下:1.先来先服务(FCFS)算法。

即先来的请求先被响应。

FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。

磁盘调度算法课程设计

磁盘调度算法课程设计

磁盘调度算法课程设计
磁盘调度算法课程设计
1.t实验任务
(1)掌握磁盘调度算法的基本概念;
(2)熟悉FCFS,SSTF,SCAN,CSCAN磁盘调度算法;
(3)根据不同的调度算法,实现磁盘调度的模拟;
(4)通过实验,观察不同的磁盘调度算法在磁盘请求序列的处理上的性能比较。

2.t实验内容
(1)使用C/C++,Java,C#等语言,根据不同的调度算法,实现磁盘调度模拟的程序;
(2)根据输入的磁盘请求序列,利用FCFS,SSTF,SCAN,CSCAN 磁盘调度算法,模拟处理这些请求序列;
(3)输出生成后的磁盘请求序列,以及各个磁盘调度算法调度完后的总寻道时间;
(4)通过比较不同磁盘调度算法的总寻道时间,对比分析不同磁盘调度算法的性能优劣;
(5)编写分析报告,完成实验内容。

3.t实验要求
(1)根据实验要求,实现磁盘调度模拟的程序,满足要求;
(2)编写分析报告,按照标准格式完成实验报告;
(3)熟练掌握磁盘调度算法的基本概念,理解各个磁盘调度算
法的特点和用途;
(4)根据不同磁盘请求序列的性质,分析不同磁盘调度算法的优劣;
(5)理解不同磁盘调度算法在处理磁盘请求的性能比较,形成自己的体会与总结。

4.t实验评价
(1)实现磁盘调度模拟的程序,满足实验要求;
(2)熟练掌握磁盘调度算法的基本概念;
(3)准确地模拟不同的调度算法,输出磁盘请求序列,求出每种调度算法的总寻道时间;
(4)根据结果及实验体会,清晰准确地分析不同的磁盘调度算法的优劣;
(5)论述清楚,思路清晰,实验报告符合格式要求,文字结构完整。

磁盘调度算法课程设计

磁盘调度算法课程设计

磁盘调度算法课程设计一、课程目标知识目标:1. 理解磁盘调度算法的基本原理和重要性;2. 掌握常用的磁盘调度算法,如FCFS、SSTF、SCAN和C-SCAN;3. 学会分析不同调度算法的性能特点及其适用场景;4. 能够运用磁盘调度算法优化磁盘访问效率。

技能目标:1. 培养学生运用所学知识解决实际问题的能力;2. 提高学生的编程实践能力,使其能够编写简单的磁盘调度算法程序;3. 培养学生通过对比分析,选择合适算法解决问题的能力。

情感态度价值观目标:1. 培养学生对计算机操作系统中磁盘调度算法的兴趣,激发学习热情;2. 培养学生团队协作精神,学会在合作中共同解决问题;3. 培养学生严谨的科学态度,认识到磁盘调度算法在计算机系统中的重要性。

本课程针对高中年级学生,课程性质为理论与实践相结合。

在教学过程中,充分考虑学生的认知特点,从实际应用出发,引导学生掌握磁盘调度算法的基本概念和原理。

通过案例分析和编程实践,使学生能够将所学知识应用于解决实际问题。

在教学过程中,注重培养学生的动手能力和团队协作精神,提高学生的综合素质。

课程目标的设定旨在使学生在掌握磁盘调度算法相关知识的基础上,培养其运用所学知识解决问题的能力,同时注重培养学生正确的情感态度价值观。

后续教学设计和评估将围绕具体学习成果展开,确保课程目标的实现。

二、教学内容本章节教学内容主要包括以下几部分:1. 磁盘调度算法概述- 了解磁盘存储器的基本结构和工作原理;- 理解磁盘调度算法的定义及其在操作系统中的作用。

2. 常用磁盘调度算法- FCFS(先来先服务)算法;- SSTF(最短寻道时间优先)算法;- SCAN(扫描)算法;- C-SCAN(循环扫描)算法。

3. 磁盘调度算法性能分析- 对比分析各种磁盘调度算法的性能指标,如寻道时间、平均等待时间等;- 探讨不同算法适用的场景和优缺点。

4. 磁盘调度算法编程实践- 学习使用编程语言实现磁盘调度算法;- 通过案例分析和编程实践,加深对磁盘调度算法的理解。

操作系统课程设计-磁盘调度模拟

操作系统课程设计-磁盘调度模拟

目录1. 需求分析 (2)2. 数据结构的设计 (2)2.1 函数介绍 (2)3.程序概要设计内容 (2)3.1磁盘调度 (2)3.1.1先来先服务(FCFS) (2)3.1.2最短时间优先算法 (3)3.1.3扫描(SCAN)调度算法 (3)3.1.4循环扫描(CSCAN)算法 (3)4.程序详细设计及流程图 (4)4.1系统流程图 (4)4.2先来先服务(FCFS) (4)4.3最短寻道时间优先(SSTF) (5)4.4扫描算法(SCAN) (5)4.5循环扫描(CSCAN)算法 (7)5.功能模块描述及使用说明 (8)5.1先来先服务调度(FCFS) (8)5.2最短寻道时间优先调度(SSTF) (8)5.3扫描调度算法(SCAN) (9)5.4循环扫描算法(CSCAN) (10)6.心得体会及结束语 (11)7.参考文献 (11)附源代码 (12)1.需求分析操作系统的任务之一就是有效的使用硬件。

对于磁盘驱动器,满足这一要求意味着要有较快的访问速度和较宽的磁盘带宽。

访问时间包括两个主要部分:寻道时间,旋转延迟。

磁盘带宽是所传递的总的字节数除以从服务请求开始到最后传递结束时的总时间。

可以通过使用好的访问顺序来调度磁盘I/O请求,提高访问速度和宽度。

本程序模拟四种磁盘调度算法:先来先服务调度(FCFS),最短寻道时间优先调度(SSTF),扫描调度算法(SCAN),循环扫描算法(CSCAN)。

并通过比较,了解各种算法的优缺点。

2. 数据结构的设计2.1 函数介绍Hand:当前磁道号;DiscLine[10]:随机生成的磁道号;void SetDI(int DiscL[])生成随机磁道号算法;void CopyL(int Sour[],int Dist[] ,int x) 数组Sour复制到数组Dist,复制到x个数(四)详细设计;void DelInq(int Sour[],int x,int y) 数组Sour把x位置的数删除,x后的数组元素向前挪一位.void PaiXu()寻道长度由低到高排序void FCFS(int Han,int DiscL[])先来先服务算法(FCFS)void SSTF(int Han,int DiscL[])最短寻道时间优先算法(SSTF)int SCAN(int Han,int DiscL[],int x,int y) 扫描算法(SCAN)void CSCAN(int Han,int DiscL[])循环扫描算法(CSCAN)3.程序概要设计内容3.1磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。

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

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

前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是: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.熟悉并掌握磁盘调度算法管理系统的设计方法,加强对所学各种调度算法及相应算法的特点了解。

模拟实现磁盘调度算法

模拟实现磁盘调度算法

《操作系统》课程实验实验课题:模拟实现磁盘调度算法姓名:****学号:*****年级班级:08级信息与计算科学教学班级:操作系统专业方向:08信本软件方向指导教师:实验时间:2010-12-9一、实验名称:模拟实现磁盘调度算法1 实验目的:a、观察、体会操作系统的磁盘调度方法,并通过一个简单的磁盘调度模拟程序的实现,加深对磁盘调度的理解。

b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。

2 实验要求:a、使用模块化设计思想来设计。

b、给出主函数和各个算法函数的流程图。

c、学生可按照自身条件,随意选择采用的算法。

二、实验算法分析总流程图三、实验内容及实验步骤1 实验内容a、模拟实现磁盘调度算法:FCFS,最短寻道优先,电梯算法(实现其中之一种以上)。

b、磁道请求服务顺序由用户输入(可通过从指定的文本文件(TXT文件)中取出)。

2 实验步骤1) 打开microsoft vasual C++ 6.0“开始”菜单—所有程序—单击“microsoft vasual C++ 6.0”,进入创建页面。

2)单击标题栏“文件”选择“新建”进入界面如下:选择‘工程,win32 console application’编辑工程名称‘zhuxuemin4’存储在d盘,创建‘创建新工作区’确定。

3)创建文件:单击标题栏“文件”选择“新建”进入界面类似于上面的界面。

4)在建好的文件中加入附件中的源程序,并进行编译。

四、实验原始记录及结果分析1 先来先服务调度算法2 最短寻道优先调度算法3电梯调度算法五、参考代码#include<stdio.h>#include<iostream.h>#include<string.h>#include<math.h>const int MAXQUEUE=200; //定义请求队列最大长度//磁道号请求结构体定义typedef struct TRACK_Node{ int iGo; //要访问的磁道号int iVisited; //磁道是否已经访问标志(1:已访问;0:末访问)}TRACK;TRACK queue[MAXQUEUE]; //磁道号请求队列数组int iReqNum=0; //磁道访问请求数int iStart=0; //磁头初始位置int iNow=0; //磁头当前位置int iSum=0; //总移动磁道数int iInput; //用户当前输入的整数char sFileName[20]; //文件名void Init() //初始化函数{int i;for(i=0;i<MAXQUEUE;i++){ queue[i].iGo=-1; //设置要访问的磁道号为不可能的数-1,以区别正常请求磁道号queue[i].iVisited=0; //设置磁道是否已经访问标志为0:末访问} } //void Init()void Reset() //重置访问标志、磁头当前位置、总移动磁道数{ int i;for(i=0;i<iReqNum;i++){ queue[i].iVisited=0; //设置磁道是否已经访问标志为0:末访问} printf( "\n 请输入磁头的初始磁道号(整数): ");scanf("%d",&iStart); //从标准输入获取用户当前输入的磁头初始位置iNow=iStart; //磁头当前位置iSum=0; //总移动磁道数} //void Reset()int ReadTrackFile() //读入磁道号流文件{ FILE *fp;int iTemp;cout<<" \n 请输入磁道号流(文本)文件名(注意:包括后缀名): ";cin>>sFileName; //从标准输入获取用户当前输入的文件名if((fp=fopen(sFileName,"r"))==NULL){ cout<<endl<<" 错误:磁道号流文件"<<sFileName<<" 打不开,请检查文件名和路径!!"<<endl; return -1; } else{ while(!feof(fp)) //将文件中输入的磁道号依次存入磁道号请求队列数组{ fscanf(fp,"%d ",&iTemp);queue[iReqNum].iGo=iTemp;iReqNum++; //磁道访问请求数} } //if((fp=fopen(sFileName,"r"))==NULL) return 0;} //void ReadTrackFile()void FCFS() //先来先服务调度算法{int i;Reset(); //重置访问标志、磁头当前位置、总移动磁道数cout<<endl<<"---------------------------------------------"<<endl;cout<<" 先来先服务调度算法的调度结果: "<<endl<<endl;cout<<" 初始磁道号: "<<iStart<<endl;cout<<" 序号下一磁道号移动的磁道数"<<endl;for(i=0;i<iReqNum;i++){ cout<<" "<<i+1<<" "<<queue[i].iGo<<" "<<abs(queue[i].iGo-iNow)<<endl;iSum+=abs(queue[i].iGo-iNow); //累加总移动磁道数iNow=queue[i].iGo; //设置磁头当前位置为当前访问磁道号} cout<<endl<<" 总调度次数: "<<iReqNum<<endl;cout<<endl<<" 总移动磁道数: "<<iSum<<endl;printf("\n 平均移动磁道数: %.2f\n\n",(float)iSum / (float)iReqNum);} //void FCFS()void SSTF() //最短寻道优先调度算法{ int i,j;int iNext; //下一磁道号Reset(); //重置访问标志、磁头当前位置、总移动磁道数cout<<endl<<"---------------------------------------------"<<endl;cout<<endl<<"---------------------------------------------"<<endl;cout<<" 最短寻道优先调度算法的调度结果: "<<endl<<endl;cout<<" 初始磁道号: "<<iStart<<endl;cout<<" 序号下一磁道号移动的磁道数"<<endl;for(i=0;i<iReqNum;i++){ iNext=0;while(queue[iNext].iVisited!=0) //跳过已访问的磁道号{ iNext++; } //whilefor(j=iNext;j<iReqNum;j++){ //寻找下一个寻道距离最短的末访问磁道号if((queue[j].iVisited==0)&&(abs(iNow-queue[iNext].iGo)>abs(iNow-queue[j].iGo))){ iNext=j; } } //for(j=iNext;j<iReqNum;j++)cout<<" "<<i+1<<" "<<queue[iNext].iGo<<" "<<abs(queue[iNext].iGo-iNow)<<endl;iSum+=abs(queue[iNext].iGo-iNow); //累加总移动磁道数queue[iNext].iVisited=1; //设置磁道是否已经访问标志为1:已访问iNow=queue[iNext].iGo; //设置磁头当前位置为当前访问磁道号} //for(i=0;i<iReqNum;i++)cout<<endl<<" 总调度次数: "<<iReqNum<<endl;cout<<endl<<" 总移动磁道数: "<<iSum<<endl;printf("\n 平均移动磁道数: %.2f\n\n",(float)iSum / (float)iReqNum);} //void SSTF()void SCAN() //电梯调度算法{ int i,j;int iNext; //下一磁道号int iMinMove; //当前方向上最短寻道距离cout<<endl<<"---------------------------------------------"<<endl;cout<<endl<<" 请选择磁头初始方向( 1 OR 2):"<<endl<<endl;cout<<" 1 磁头初始向内"<<endl<<endl<<" 2 磁头初始向外"<<endl<<endl<<" "; cin>>iInput; //从标准输入获取用户当前输入的整数switch(iInput) //用户当前输入的整数{case 1: //磁头初始向内Reset(); //重置访问标志、磁头当前位置、总移动磁道数cout<<endl<<"---------------------------------------------"<<endl;cout<<" 电梯调度算法--磁头初始向内的调度结果: "<<endl<<endl;cout<<" 初始磁道号: "<<iStart<<endl;cout<<" 序号下一磁道号移动的磁道数"<<endl;for(i=0;i<iReqNum;i++){iMinMove=9999;iNext=-1;for(j=0;j<iReqNum;j++) //寻找当前方向上寻道距离最短的末访问磁道号{ if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow)){ if(abs(queue[j].iGo-iNow)<iMinMove){ iNext=j;iMinMove=abs(queue[j].iGo-iNow);} //if(abs(queue[j].iGo-iNow)<iMinMove)} //if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow))} //for(j=0;j<iReqNum;j++)if(iNext!=-1){ cout<<" "<<i+1<<" "<<queue[iNext].iGo<<" "<<abs(queue[iNext].iGo-iNow)<<endl;iSum+=abs(queue[iNext].iGo-iNow); //累加总移动磁道数iNow=queue[iNext].iGo; //设置磁头当前位置为当前访问磁道号queue[iNext].iVisited=1; //设置磁道是否已经访问标志为1:已访问} //if(iNext!=-1) else //掉头向外{ for(j=0;j<iReqNum;j++) //寻找当前方向上寻道距离最短的末访问磁道号{ if((queue[j].iVisited==0)&&(queue[j].iGo<iNow)){ if(abs(queue[j].iGo-iNow)<iMinMove){ iNext=j;iMinMove=abs(queue[j].iGo-iNow);} } } //for(j=0;j<iReqNum;j++)cout<<" "<<i+1<<" "<<queue[iNext].iGo<<" "<<abs(queue[iNext].iGo-iNow)<<endl;iSum+=abs(queue[iNext].iGo-iNow); //累加总移动磁道数iNow=queue[iNext].iGo; //设置磁头当前位置为当前访问磁道号queue[iNext].iVisited=1; //设置磁道是否已经访问标志为1:已访问} //if(iNext!=-1) } //for(i=0;i<iReqNum;i++)cout<<endl<<" 总调度次数: "<<iReqNum<<endl;cout<<endl<<" 总移动磁道数: "<<iSum<<endl;printf("\n 平均移动磁道数: %.2f\n\n",(float)iSum / (float)iReqNum);break;case 2: //磁头初始向外Reset(); //重置访问标志、磁头当前位置、总移动磁道数cout<<endl<<"---------------------------------------------"<<endl;cout<<endl<<endl<<" 电梯调度算法--磁头初始向外的调度结果: "<<endl<<endl;cout<<" 初始磁道号: "<<iStart<<endl;cout<<" 序号下一磁道号移动的磁道数"<<endl;for(i=0;i<iReqNum;i++){ iMinMove=9999;iNext=-1;for(j=0;j<iReqNum;j++) //寻找当前方向上寻道距离最短的末访问磁道号{ if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow)){ if(abs(queue[j].iGo-iNow)<iMinMove){ iNext=j;iMinMove=abs(queue[j].iGo-iNow);} //if(abs(queue[j].iGo-iNow)<iMinMove)} //if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow))} //for(j=0;j<iReqNum;j++)if(iNext!=-1){ cout<<" "<<i+1<<" "<<queue[iNext].iGo<<" "<<abs(queue[iNext].iGo-iNow)<<endl;iSum+=abs(queue[iNext].iGo-iNow); //累加总移动磁道数iNow=queue[iNext].iGo; //设置磁头当前位置为当前访问磁道号queue[iNext].iVisited=1; //设置磁道是否已经访问标志为1:已访问} else //掉头向内{ for(j=0;j<iReqNum;j++) //寻找当前方向上寻道距离最短的末访问磁道号{ if((queue[j].iVisited==0)&&(queue[j].iGo>iNow)){ if(abs(queue[j].iGo-iNow)<iMinMove){ iNext=j;iMinMove=abs(queue[j].iGo-iNow); } //if(abs(queue[j].iGo-iNow)<iMinMove)} //if((queue[j].iVisited==0)&&(queue[j].iGo>iNow))} //for(j=0;j<iReqNum;j++) cout<<" "<<i+1<<" "<<queue[iNext].iGo<<" "<<abs(queue[iNext].iGo-iNow)<<endl;iSum+=abs(queue[iNext].iGo-iNow); //累加总移动磁道数iNow=queue[iNext].iGo; //设置磁头当前位置为当前访问磁道号queue[iNext].iVisited=1; //设置磁道是否已经访问标志为1:已访问} //if(iNext!=-1)} //for(i=0;i<iReqNum;i++)cout<<endl<<" 总调度次数: "<<iReqNum<<endl;cout<<endl<<" 总移动磁道数: "<<iSum<<endl;printf("\n 平均移动磁道数: %.2f\n\n",(float)iSum / (float)iReqNum);break;default:printf("\n 输入错误!!\n\n");return;} //switch(iInput)} //void SCAN()void Version() //显示版权信息函数{ cout<<endl<<endl;cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<" ┃磁盘调度算法模拟系统┃"<<endl;cout<<" ┠───────────────────────┨"<<endl;cout<<" ┃(c)All Right Reserved ┃"<<endl;cout<<" ┃程坤┃"<<endl;cout<<" ┃Version 2010 build 2.0 ┃"<<endl;cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;cout<<endl<<endl; }// void Version()void main(){ int i;bool bGoOn; //是否继续磁盘调度算法模拟的标志char sGoOn[1]; //用户输入是否继续磁盘调度算法模拟的字母:y、Y、N、nVersion();//显示版权信息函数Init(); //初始化函数if(ReadTrackFile()==-1) //读入磁道号流文件{printf(" 读入磁道号流文件失败!!\n\n"); }else{bGoOn= true;while (bGoOn){cout<<endl<<"---------------------------------------------"<<endl;cout<<" 从磁道号流文件"<<sFileName<<" 所读入的磁道号流如下:"<<endl<<endl<<" ";for(i=0;i<iReqNum;i++){ cout<<queue[i].iGo<<" "; }cout<<endl<<endl<<" 请求数为: "<<iReqNum<<endl<<endl;iInput=-1; //用户输入的整数以选择算法cout<<endl<<" 请输入算法编号( 1 OR 2 OR 3)选择调度算法:"<<endl<<endl; cout<<"1 先来先服务调度算法"<<endl<<endl<<"2 最短寻道优先调度算法"<<endl<<endl<<"3 电梯调度算法"<<endl<<endl<<" ";cin>>iInput; //从标准输入获取用户当前输入的整数switch(iInput) //用户输入的整数以选择算法{case 1: FCFS(); //先来先服务调度算法break;case 2: SSTF(); //最短寻道优先调度算法break;case 3:SCAN(); //电梯调度算法break;default:printf("\n 输入的算法编号错误!!\n\n");return; } //switch(iInput)bGoOn= false;strcpy(sGoOn," ");cout<<" 要继续进行磁盘调度算法模拟吗?(Y/N) "<<endl<<" ";cin>>sGoOn;bGoOn=(sGoOn[0]=='y'||sGoOn[0]=='Y');} //while bGoOn } //if(ReadTrackFile()==-1) }【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】精品文档交流。

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现学院专业学号学生姓名指导教师姓名2014年3月19日目录一、课设简介 (2)1.1 课程设计题目 (2)1.2 课程设计目的 (2)1.3 课程设计要求 (2)二、设计内容 (3)2.1功能实现 (3)2.2流程图 (3)2.3具体内容 (3)三、测试数据 (4)3.3 测试用例及运行结果 (4)四、源代码 (5)五、总结 (12)5.1 总结............................................一、课设简介1.1课程设计题目磁盘调度算法的模拟实现11.2程序设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

1)进一步巩固和复习操作系统的基础知识。

2)培养学生结构化程序、模块化程序设计的方法和能力。

3)提高学生调试程序的技巧和软件设计的能力。

4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

1.3 设计要求1)磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。

2)最好能实现磁道号序列中磁道号的动态增加。

3)磁道访问序列以链表的形式存储4)给出各磁盘调度算法的调度顺序和平均寻道长度二、设计内容2.1 功能实现设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。

1)FCFS 2)SSTF2.2流程图2.3具体内容1)先来先服务算法FCFS这是一种比较简单的磁盘调度算法。

它根据进程请求访问磁盘的先后次序进行调度。

此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

2)最短寻道时间优先算法SSTF该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。

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

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

操作系统课程设计-磁盘调度算法前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是:1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN)。

启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送;因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。

延迟时间——指定扇区旋转到磁头下所需的时间。

传送时间——由磁头进程读写完成信息传送的时间,寻道时间——指计算机在发出一个寻址命令,到相应目标数据被找到所需时间;其中传送信息所花的时间,是在硬件设计时固定的,而寻找时间和延迟时间是与信息在磁盘上的位置有关;然后设计出磁盘调度的设计方式,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等,并给出详细的算法设计,对编码进行了测试与分析。

最后进行个人总结与设计体会。

关键词:最短寻道时间优先算法、扫描算法、总寻道长度.3.2 实现过程中用到的数据结构1.最短寻道时间优先(SSTF)图a SSTF调度算法示例图ciidao[]={55,58,39,18,90,160,150,38,184}(可随机生成多个)用冒泡法对磁道数组进行排序用户输入当前磁道号now,比较当前返回内侧(外侧)扫描将当前磁道号与剩余没有图b SSTF算法流程示例图原磁道号随机组成的数组:cidao[]={55,58,39,18,90,160,150,38,184};排序后的数组={18,38,39,5,58,90,150,160,184};输入当前磁道号:now=100;3839 39 55 55 55 58 58 58 58 90 90 90 90 90 now值:100 90 58 55 39 184160 160150 150 15018 18 18 1838 38 38 3839 39 39 3955 55 55 5558 58 58 5890 90 90 90now值:18 150 160 184图c SSTF算法队列示意图(按磁道访问顺序)2.扫描(SCAN)算法图d SCAN算法示例图原磁道号随机组成的数组:cidao[]={55,58,39,18,90,160,150,38,184};排序后的数组={18,38,39,5,58,90,150,160,184};输入当前磁道号:now=100;选择磁道移动方向;以磁道号增加的方向移动为例:55 58 58 90 90 90 184 184 184 184 160 160 160 160 160 150 150 150 150 150 150 now值:100 150 160 184 90 58 1838 3839 39 3955 55 5558 58 5890 90 90184 184 184160 160 160150 150 150now值:55 39 38图e SCAN算法队列示意图(按磁道访问顺序)3.3 实现过程中用到的系统调用系统模块调用关系图4. 程序设计与实现4.1 最短寻道时间优先算法(SSTF )模块4.1.1程序流程图磁盘调度算法最短寻道扫描算法退出4.1.2 程序说明算法分析①优点:相较于先来先服务算法(FCFS)有更好的寻道性能,使每次的寻道时间最短。

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

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

磁盘调度1.设计目的加深对操作系统的磁盘调度的进一步理解以及进一步的认识。

加强实践能力和动手动脑能力,同时加深对磁盘调度概念的理解,同时也再一次提高了自己编程的能力。

2. 任务及要求2.1 设计任务分析设计模拟磁盘管理系统的方法,加深对磁盘调度算法的了解以及个算法的特点。

2.2 设计要求分别设计出先来先服务算法,最短寻道时间优先算法,扫描算法。

并分别求出它们的平均寻道时间。

3. 算法及数据结构3.1算法的总体思想(流程)1.先来先服务的算法,即先来的请求先被响应。

FCFS算法看起来是比较合理的算法,但是当请求频率过高的时候FCFS算法的响应时间就会大大的延长,这也是最基本的算法,直接实现的是由输入的顺序来顺序的执行。

2.最短寻道时间优先算法,要求访问的磁道,与当前磁头所在的磁道的距离最近,从而以使每次的寻道时间最短。

3.扫描磁盘调度,该算法不考虑与访问磁道与当前磁道的距离,更优先考虑的磁头当前的移动方向,例如,当磁头正在有向外移动时,SCAN算法所考虑的下一个访问对象,应是其与访问的磁道,即在当前磁道之外,又是最近的。

这样磁头逐渐的从外向里移动,直至再无更里面的磁道要访问,从而避免了出饥饿的情况。

3.2先来先服务模块3.2.1 功能实现磁盘调度的先来先服务调度。

3.2.2 数据结构用链表来存储输入的数据,即各待访问的磁道。

然后遍历这个链表,依次对这个链表进行访问,从而实现先来先服务调度。

3.2.3 算法void fcfs(Node *head,int c,int f) //先来先服务算法{void print(Node *);Node *l; //,*m,*n;float num=0;l=head->next;for(int i=0;i<c;i++){num+=abs(l->data-f);f=l->data;l=l->next;}num=num/c;cout<<"先来先服务的寻道顺序是:"<<endl;print(head);cout<<"平均寻道长度:"<<num<<endl;}3.3最短寻道时间优先模块3.3.1功能实现磁盘调度的最短寻道时间调度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

某某大学课程设计报告课程名称:操作系统设计题目:模拟磁盘调度算法系别:计算机系专业:计算机科学与技术组别:学生姓名: 学号:起止日期:指导教师:目录第一章需求分析 (1)1.1课程设计的简介 (1)1.2课程设计的目的 (1)1.3磁盘调度主要思想 (1)1.4课程设计内容 (2)第二章概要设计 (3)2.1设计思想 (3)2.2 数据结构 (3)2.3模块调用关系图 (3)2.4子模块程序流程图 (5)第三章详细设计 (6)3.1模块划分 (6)第四章代码测试 (9)4.1先来先服务 (9)4.1最短寻道时间优先 (11)4.1扫描算法 (12)第五章心得体会 (13)第六章致谢 (13)参考文献 (1)附源代码 (2)第一章需求分析1.1课程设计的简介这是一个用VC++6.0为工具、C++为编程语言而实现模拟先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)的一个磁盘调度程序。

该程序设计系统主界面可以灵活选择某种算法并算出磁头移动的总磁道数以及平均磁道数。

1.2课程设计的目的本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)等磁盘调度算法的理解。

1.3磁盘调度主要思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。

常用的分配策略有先请求先分配、优先级高者先分配等策略。

在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。

操作系统中,对磁盘的访问要求来自多方面,常常需要排队。

这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。

访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。

因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。

平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即: L=(M1+M2+……+Mi+……+MN)/N。

其中Mi为所需访问的磁道号所需移动的磁道数。

启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。

因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。

延迟时间——指定扇区旋转到磁头下所需的时间。

传送时间——由磁头进程读写完成信息传送的时间。

其中传送信息所花的时间,是在硬件设计就固定的。

而寻找时间和延迟时间是与信息在磁盘上的位置有关。

为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。

而是按柱面存放,同一柱面上的各磁道被放满信息后,再放到下一个柱面上。

所以各磁盘的编号按柱面顺序(从0号柱面开始),每个柱面按磁道顺序,每个磁道又按扇区顺序进行排序。

1.4课程设计内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)。

并计算及比较磁头移动总磁道数和平均磁道数。

1.4.1、先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。

它根据进程请求访问磁盘的先后次序进行调度。

此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

1.4.2、最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。

其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。

在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。

1.4.3、扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。

这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。

由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。

此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。

第二章概要设计2.1设计思想本次课程设计我们是以面向对象的思想为主,利用Visual C++为工具实现模拟磁盘调度。

程序主要是利用冒泡排序函数、FCFS函数、SSTF函数、SCAN 函数、CSCAN函数实现函数的功能。

利用菜单式的选择界面,方便的用户操作。

最终对每一种模拟磁盘调度输出磁头平均移动的磁道数以及总磁道数。

2.2 数据结构该程序主要是利用7个函数。

Panduan()函数:对输入的字符进行判断是否合法,zhuanhua()函数:对输入合法的字符进行转化,bubble()函数:对输入的磁道进行冒泡排序,FCFS()函数,即先来先服务函数,SSTF()函数:最短最短寻道时间函数,SCAN()函数:扫描函数,CSCAN()函数:循环扫描函数。

各函数之间有点可以相互调用,共同实现要求。

本程序主要用到的数据结构为数组、字符串,包括对字符串的合法性判断,利用数组算磁头移动的总磁道数,平均移动磁道数。

2.3模块调用关系图图2-1 磁盘调度模拟系统2.4子模块程序流程图2.4.1先来先服务算法(FCFS)流程图:2.4.2最短寻道时间优先算法(SSTF)流程图2.4.3扫描算法(SCAN)流程图第三章详细设计3.1模块划分本系统划分为四个模块:先来先服务算法模块int FCFS(int array[],int m)、最短寻道时间优先算法模块int SSTF(int array[],int m)、扫描算法模块int SCAN(int array[],int m)3.1.1 先来先服务算法模块:int 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);}3.1.2 最短寻道时间优先算法模块:int 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.1.3 扫描算法模块:int 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.1 先来先服务算法输入磁道序列:65 78 34 23 87 100 18 26当前磁道号:80磁盘扫描序列为:65 78 34 23 87 100 18 26平均寻到长度:31.25磁头移动总磁道数:2504.2 最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:200磁盘扫描序列为100 87 78 65 34 26 23 18平均寻到长度:22.75磁头移动总磁道数:182(2)当前磁道号小于磁道序列中的最小的磁道号时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:10磁盘扫描序列为:18 23 26 34 65 78 87 100平均扫描长度:11.25磁道移动总磁道数:90(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:80磁盘扫描序列为:78 87 100 65 34 26 23 18平均扫描长度:13.25磁道移动总磁道数:1064.3 扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:200磁盘扫描序列为100 87 78 65 34 26 23 18平均寻到长度:22.75磁头移动总磁道数:182(2)当前磁道号小于磁道序列中的最小的磁道号时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:10磁盘扫描序列为:18 23 26 34 65 78 87 100平均扫描长度:11.25磁道移动总磁道数:90(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时输入磁道序列:65 78 34 23 87 100 18 26排序后的磁道序列为:18 23 26 34 65 78 87 100当前磁道号:80请输入当前移动臂的移动的方向(1表示向外,0表示向内):1磁盘扫描序列为:87 100 78 65 34 26 23 18平均寻到长度:12.75磁道移动总磁道数:102第五章心的体会通过这次的课程设计使我认识到要将操作系统这门计算机专业的课学好不仅仅是要把书上的基本知识学好而且还要不断进行实践,将所学的跟实践操作结合起来才能更好地巩固所学,才能提高自己实践能力.通过这次的设计使我认识到只停留在表面理解问题是很难使问题得到很好的解决的,实践能力与理论知识同样重要。

相关文档
最新文档