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

操纵体系课程设计义务书题目:磁盘调剂算法院系:专业:班级:姓名:学号:指点教师:设计时光:指导教师评语目次1.需求剖析44472.概要设计88883.具体设计911134.运行成果及剖析1415165.总结和心得166.参考文献177.附录:程序源代码231.需求剖析此次课程设计我研讨的标题是:磁盘调剂算法.具体包含三种算法分离是:先来先办事算法(FCFS).最短寻道时光优先算法(SSTF).扫描算法(电梯调剂算法)(SCAN).经由过程此次试验,加深对磁盘调剂算法的懂得,进一步控制先来先办事FCFS,最短寻道时光优先SSTF,扫描SCAN算法的实现办法.装备的动态分派算法与过程调剂类似,也是基于必定的分派计谋的.经常应用的分派计谋有先请求先分派.优先级高者先分派等计谋.在多道程序体系中,低效力平日是因为磁盘类扭转装备应用不当造成的.操纵体系中,对磁盘的拜访请求来自多方面,经常须要列队.这时,对浩瀚的拜访请求按必定的次序响应,会直接影响磁盘的工作效力,进而影响体系的机能.拜访磁盘的时光因子由3部分构成,它们是查找(查找磁道)时光.等待(扭转等待扇区)时光和数据传输时光,个中查找时光是决议身分.是以,磁盘调剂算法先斟酌优化查找计谋,须要时再优化扭转等待计谋.平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需拜访的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N个中Mi为所需拜访的磁道号所需移动的磁道数.启动磁盘履行输入输出操纵时,要把移动臂移动到指定的柱面,再等待指定扇区的扭转到磁头地位下,然后让指定的磁头进行读写,完成信息传送.是以,履行一次输入输出所花的时光有:查找时光——磁头在移动臂带动下移动到指定柱面所花的时光. 延迟时光——指定扇区扭转到磁头下所需的时光. 传送时光——由磁头过程读写完成信息传送的时光.个中传送信息所花的时光,是在硬件设计就固定的.而查找时光和延迟时光是与信息在磁盘上的地位有关.为了削减移动臂进行移动消费的时光,每个文件的信息不是按盘面上的磁道次序存放满一个盘面后,再放到下一个盘面上.而是按柱面存放,统一柱面上的各磁道被放满信息后,再放到下一个柱面上.所以各磁盘的编号按柱面次序,每个柱面按磁道次序,每个磁道又按扇区次序进行排序.磁盘是可供多个过程共享的装备,当有多个过程都请求拜访磁盘是,应采取一种最佳调剂算法,以使各类过程对磁盘的平均拜访时光最小.因为在拜访磁盘的时光中,主如果寻道时光,是以,磁盘调剂的目的,是使磁盘的平均寻道时光起码.今朝经常应用的磁盘帝调剂算法有:先来先办事.最短寻道时光优先及扫描等算法.先来先办事(FCFS)调剂:按先来后到次序办事,未作优化.最简略的移臂调剂算法是“先来先办事”调剂算法,这个算法现实上不斟酌拜访者请求拜访的物理地位,而只是斟酌拜访者提出拜访请求的先后次序.例如,假如如今读写磁头正在50号柱面上履行输出操纵,而等待拜访者依次要拜访的柱面为130.199.32.159.15.148.61.99,那么,当50号柱面上的操纵停止后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面.采取先来先办事算法决议等待拜访者履行输入输出操纵的次序时,移动臂往返地移动.先来先办事算法消费的查找时光较长,所以履行输入输出操纵的总时光也很长.最短查找时光优先调剂算法老是从等待拜访者中遴选查找时光最短的谁人请求先履行的,而不管拜访者到来的先后次序.如今仍应用统一个例子来评论辩论,如今当50号柱面的操纵停止后,应当先处理61号柱面的请求,然后到达32号柱面履行操纵,随后处理15号柱面请求,后继操纵的次序应当是99.130.148.159.199.采取最短查找时光优先算法决议等待拜访者履行操纵的次序时,读写磁头总共移动了200多个柱面的距离,与先来先办事.算法比较,大幅度地削减了查找时光,因而缩短了为各拜访者请求办事的平均时光,也就进步了体系效力.但最短查找时光优先(SSTF)调剂,FCFS会引起读写头在盘面上的大规模移动,SSTF查找距离磁头最短(也就是查找时光最短)的请求作为下一次办事的对象.SSTF查找模式有高度局部化的偏向,会推迟一些请求的办事,甚至引起无穷迁延(又称饥饿).SCAN 算法又称电梯调剂算法.SCAN算法是磁头进步偏向上的最短查找时光优先算法,它清除了磁头在盘面局部地位上的来去移动,SCAN算法在很大程度上清除了SSTF算法的不公正性,但仍有利于对中央磁道的请求.“电梯调剂”算法是从移动臂当前地位开端沿着臂的移动偏向去选择离当前移动臂比来的谁人柱拜访者,假如沿臂的移动偏向无请求拜访时,就转变臂的移动偏向再选择.这比如乘电梯,假如电梯已向上活动到4层时,依次有3位乘客陈生.伍生.张生在等候乘电梯.他们的请求是:陈生在2层等待去10层;伍生在5层等待去底层;张生在8层等待15层.因为电梯今朝活动偏向是向上,所以电梯的形成是先把乘客张生从8层带到15层,然后电梯换成下行偏向,把乘客伍生从5层带到底层,电梯最后再更换偏向,把乘客陈生从2层送到10层.但是,“电梯调剂”算法在实现时,不但要记住读写磁头的当前地位,还必须记住移动臂的当前进步偏向.2.概要设计经由过程C说话的编程,设计程序模仿先来先办事FCFS,最短寻道时光优先SSTF,和扫描SCAN算法的工作过程.假设有n个磁道号所构成的磁道拜访序列,给定开端磁道号m和磁头移动的偏向(正向或者反向),分离应用不合的磁盘调剂算法拜访磁道序列,给出磁头每一次移动的过程,算出磁头移动的距离,继而盘算每种算法的平均寻道长度.C说话.操纵体系磁盘调剂算法.C++.Window10.VC++6.0.3.具体设计先来先办事算法(FCFS):扫描先来先办compute_dis(m_vec,dis,average_distance);}最短寻道时光优先算法(SSTF):void SSTF(vector<int>m_vec,int position){ //最短寻道时光算法dis = 0;average_distance = 0;sort(m_vec.begin(),m_vec.end()); //从小到大排序int i = 0;for(vector<int>::iteratorit=m_vec.begin();it!=m_vec.end();it++){if(position >= *it)i++;}int count = 0;int left = i-1;int right = i;while(count<m_vec.size()){if((left >=0 && abs(m_vec[right]-position) >abs(m_vec[left]-position)) ||right>=m_vec.size()){dis += abs(m_vec[left]-position);Sleep(500);cout<<"->"<<m_vec[left];position = m_vec[left];left--;}else{dis += abs(m_vec[right]-position);Sleep(500);cout<<"->"<<m_vec[right];position = m_vec[right];right++;}count++;}compute_dis(m_vec,dis,average_distance);}扫描SCAN算法:void SCAN(vector<int>m_vec,int position){ //电梯调剂算法dis = 0;average_distance = 0;sort(m_vec.begin(),m_vec.end()); //从小到大排序int i = 0;for(vector<int>::iteratorit=m_vec.begin();it!=m_vec.end();it++){if(position >= *it)i++; //找到position地点的磁道}int left = i - 1; //先从外到内扫描int right = i;while(left >= 0){dis += abs(position - m_vec[left]);Sleep(500);cout<<"->"<<m_vec[left];position = m_vec[left];left --;}while(right < m_vec.size()){dis += abs(position - m_vec[right]);Sleep(500);cout<<"->"<<m_vec[right];position = m_vec[right];right ++;}compute_dis(m_vec,dis,average_distance);}4.运行成果及剖析先来先办事算法(FCFS):最短寻道时光优先算法(SSTF):扫描SCAN算法:FCFS :这是一种比较简略的磁盘调剂算法.它依据过程请求拜访磁盘的先后次序进行调剂.此算法因为未对寻道进行优化,在对磁盘的拜访请求比较多的情形下,此算法将下降装备办事的吞吐量,致使平均寻道时光可能较长,但各过程得到办事的响应时光的变更幅度较小.SSTF:该算法选择如许的过程,其请求拜访的磁道与当前磁头地点的磁道距离比来,以使每次的寻道时光最短,该算法可以得到比较好的吞吐量,但却不克不及包管平均寻道时光最短.SCAN :扫描算法不但斟酌到欲拜访的磁道与当前磁道的距离,更优先斟酌的是磁头的当前移动偏向.此算法根本上战胜了最短寻道时光优先算法的办事分散于中央磁道和响应时光变更比较大的缺陷,而具有最短寻道时光优先算法的长处即吞吐量较大,平均响应时光较小,但因为是摆动式的扫描办法,两侧磁道被拜访的频率仍低于中央磁道.5.总结和心得经由过程此次的课程设计使我熟悉到要将操纵体系这门盘算机专业的课学好不但仅是要把书上的根本常识学好并且还要不竭进行实践,将所学的跟实践操纵联合起来才干更好地巩固所学,才干进步本身实践才能.经由过程此次的设计使我熟悉到只逗留在概况懂得问题是很难使问题得到很好的解决的,实践才能与理论常识同样重要.可以说此课程设计的理论难度其实不大,各类流图设计特殊是算法过程图的设计很轻易疏忽操纵性细节,在现实调试中带来很大麻烦,须要特殊留意,但是若要深刻挖掘个中的器械,并且现实去编程实现,就碰到了相当大的难度.因为与之涉及的许多方面并没有学过,须要本身去自学和实践磨练.经由过程模仿磁盘调剂及过程列队算法来加深对操纵体系中各个磁臂调剂算法概念的懂得模仿磁盘调剂算法,实现各类不合调剂算法的过程,并盘算各算法的平均寻道长度,以便于我们断定各类算法的好坏以及各类算法应用的场合.6.参考文献[1]. 汤子瀛,哲凤屏,汤小丹. 《盘算机操纵体系》.西安电子科技大学出版社, 2005;[2]. 谭浩强编著.《 C说话程序设计(第3版)》.清华大学出版社,2005;[3]. 吴乃陵,况迎辉. 《C++程序设计(第二版)》.高级教导出版社,2005.7.附录:程序源代码FCFS:#include <iostream>#include <time.h>#include <vector>#include<algorithm>#include <math.h>#include <stdlib.h>#include <cstring>#include <windows.h>#include <fstream>using namespace std;int position = 0; //当前磁道地位int dis = 0;double average_distance = 0;void request(vector<int>&m_vec,ofstream &outfile){cout<<"随机生成磁盘序列:"<<endl;int n = 0;srand(time(NULL)); //添加随机数种子n = rand() % 20 + 1;int temp = 0;for(int i=0;i<n;i++){temp = rand() % 100;m_vec.push_back(temp);cout<<temp<<" ";outfile<<temp<<endl;}cout<<endl;position = rand() % 100;cout<<"当前磁道:"<<position<<endl;}void compute_dis(vector<int>m_vec,int &dis,double&average_distance){average_distance = (double)dis / (double)m_vec.size(); }void FCFS(vector<int>m_vec,int position){ //先来先办事算法dis = 0;average_distance = 0;for(vector<int>::iteratorit=m_vec.begin();it!=m_vec.end();it++){dis += abs(position-*it);Sleep(500);cout<<"->"<<*it;position = *it;}compute_dis(m_vec,dis,average_distance);}void print(){cout<<endl<<endl;cout<<"经盘算,磁头移动的总距离为:"<<dis<<endl;cout<<"磁头平均移动距离:"<<average_distance<<endl; cout<<endl<<endl;}int main(){ofstream outfile;outfile.open("data.txt");vector<int>m_vec;request(m_vec,outfile); //请求办事序列cout<<"磁盘请求的办事状态:"<<endl;FCFS(m_vec, position);print();outfile.close();return 0;}SSTF:#include <iostream>#include <time.h>#include <vector>#include <math.h>#include <stdlib.h>#include<algorithm>#include <cstring>#include <windows.h>#include <fstream>using namespace std;int position = 0; //当前磁道地位int dis = 0;double average_distance = 0;void request(vector<int>&m_vec,ofstream &outfile){ cout<<"随机生成磁盘序列:"<<endl;int n = 0;srand(time(NULL)); //添加随机数种子n = rand() % 20 + 1;int temp = 0;for(int i=0;i<n;i++){temp = rand() % 100;m_vec.push_back(temp);cout<<temp<<" ";outfile<<temp<<endl;}cout<<endl;position = rand() % 100;cout<<"当前磁道:"<<position<<endl;}void compute_dis(vector<int>m_vec,int &dis,double&average_distance){average_distance = (double)dis / (double)m_vec.size(); }void SSTF(vector<int>m_vec,int position){ //最短寻道时光算法dis = 0;average_distance = 0;sort(m_vec.begin(),m_vec.end()); //从小到大排序int i = 0;for(vector<int>::iteratorit=m_vec.begin();it!=m_vec.end();it++){if(position >= *it)i++;}int count = 0;int left = i-1;int right = i;while(count<m_vec.size()){if((left >=0 && abs(m_vec[right]-position) > abs(m_vec[left]-position)) || right>=m_vec.size()){ dis += abs(m_vec[left]-position);Sleep(500);cout<<"->"<<m_vec[left];position = m_vec[left];left--;}else{dis += abs(m_vec[right]-position);Sleep(500);cout<<"->"<<m_vec[right];position = m_vec[right];right++;}count++;}compute_dis(m_vec,dis,average_distance);}void print(){cout<<endl<<endl;cout<<"经盘算,磁头移动的总距离为:"<<dis<<endl;cout<<"磁头平均移动距离:"<<average_distance<<endl; cout<<endl<<endl;}int main(){ofstream outfile;outfile.open("data.txt");vector<int>m_vec;request(m_vec,outfile); //请求办事序列cout<<"磁盘请求的办事状态:"<<endl;SSTF(m_vec, position);print();outfile.close();return 0;}SCAN:#include <iostream>#include <time.h>#include <vector>#include <math.h>#include <stdlib.h>#include<algorithm>#include <cstring>#include <windows.h>#include <fstream>using namespace std;int position = 0; //当前磁道地位int dis = 0;double average_distance = 0;void request(vector<int>&m_vec,ofstream &outfile){ cout<<"随机生成磁盘序列:"<<endl;int n = 0;srand(time(NULL)); //添加随机数种子n = rand() % 20 + 1;int temp = 0;for(int i=0;i<n;i++){temp = rand() % 100;m_vec.push_back(temp);cout<<temp<<" ";outfile<<temp<<endl;}cout<<endl;position = rand() % 100;cout<<"当前磁道:"<<position<<endl;}void compute_dis(vector<int>m_vec,int &dis,double&average_distance){average_distance = (double)dis / (double)m_vec.size(); }void SCAN(vector<int>m_vec,int position){ //电梯调剂算法dis = 0;average_distance = 0;sort(m_vec.begin(),m_vec.end()); //从小到大排序int i = 0;for(vector<int>::iteratorit=m_vec.begin();it!=m_vec.end();it++){if(position >= *it)i++; //找到position地点的磁道}int left = i - 1; //先从外到内扫描int right = i;while(left >= 0){dis += abs(position - m_vec[left]);Sleep(500);cout<<"->"<<m_vec[left];position = m_vec[left];left --;}while(right < m_vec.size()){dis += abs(position - m_vec[right]);Sleep(500);cout<<"->"<<m_vec[right];position = m_vec[right];right ++;}compute_dis(m_vec,dis,average_distance);}void print(){cout<<endl<<endl;cout<<"经盘算,磁头移动的总距离为:"<<dis<<endl;cout<<"磁头平均移动距离:"<<average_distance<<endl;cout<<endl<<endl;}int main(){ofstream outfile;outfile.open("data.txt");vector<int>m_vec;request(m_vec,outfile); //请求办事序列 cout<<"磁盘请求的办事状态:"<<endl;SCAN(m_vec, position);print();outfile.close();return 0;}。
操作系统课程设计--磁盘调度先来先服务算法

《操作系统原理》课程设计报告书题目:磁盘调度先来先服务算法学号:学生姓名:专业:计算机科学与技术指导教师:2014 年 5 月 29目录1 功能描述 (2)1.1 功能实现思想 (2)1.2 功能详述 (2)2 系统设计 (2)2.1 系统总体设计 (2)2.1.1 数据结构描述 (2)2.1.2 函数功能分析 (2)2.1.2 程序函数调用关系 (3)2.2 系统详细设计 (3)2.2.1 设计任务 (3)2.2.2 设计要求 (3)2.2.3 算法思想 (3)2.2.4 FCFS 算法流程图 (4)3 系统实现 (4)4 系统测试与分析 (5)4.1 系统运行结果 (5)4.2 系统运行结果分析 (5)5 总结 (6)参考文献 (6)附:源程序代码 (7)教师评分表 (10)1 功能描述根据进程请求访问磁盘的先后次序进行调度,从而计算出磁头移动的总距离和平均寻道长度。
1.1 功能实现思想这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
1.2 功能详述根据进程请求访问磁盘的先后次序进行调度,首先根据提示输入总的磁道数、提出磁盘I/O申请的进程数、开始磁道号和磁道序列。
通过程序调用函数输出磁盘请求序列和磁盘扫描序列,从而计算出磁头移动的总距离和平均寻道长度。
2 系统设计2.1 系统总体设计2.1.1 数据结构描述void FCFS(int cidao[],int m)输入磁道号,按先来先服务的策略输出磁盘请求序列和磁盘扫描序列,求移动的总距离和平均寻道长度,输出移动的总磁道数和平均寻道长度。
2.1.2 函数功能分析由于一开始要对键盘输入的磁道数和要使用的算法进行一次有效性的判断,我使用了int decide(char str[]),如果输入的信息不是0~9之间的数都将被判定为不合法,合法后才能进行下一步。
操作系统课程设计-磁盘调度算法

序止之阳早格格创做纲要:本课程安排的脚段是通过安排一个磁盘调动模拟系统,进而使磁盘调动算法越收局里化,使磁盘调动的特性更简朴明白,那里主要真止磁盘调动的四种算法,分别是: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处事效用.安排历程中逢到的艰易正在教授战共教的助闲下乐成办理并通过了查支,尔深刻认识到算法的逻辑性对付步调的要害做用,算法的准确度对付步调运止截止的要害做用,那对付尔以去正在支配系统的教习中有极大助闲.每一次的课程安排皆是对付自己之前所教知识的加强,是一次罕见的教习机会.正在课程安排的每一个步调、每一段代码的真止,皆要反复去斟酌,反复运止调试,一面面的小偏偏好皆市引导波折.果为乐成阻挡易,所以当调试板上隐现“死成乐成”时,谦背的成便感是不问可知的.通过自己的动脚动脑,不但是减少了知识,还给了尔博业知识以及博业技能上的提下,对付普及自己的思维本领战支配本领也有很大的助闲.共时尔也会越收有自疑心,越收齐力,严肃教习,争与正在以去的课程中搞得更佳!。
操作系统课程设计报告磁盘调度算法

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

操作系统课程设计磁盘调度算法学院专业学号学生姓名指导教师姓名2014年3月20 日目录第1部分课设简介 (3)1.1 课程设计题目 (3)1.2 课程设计目的 (3)1.3 课程设计内容 (3)1.4 时间安排 (3)第2部分实验原理分析 (5)2.1问题描述 (5)2.2流程图 (6)第3部分主要的功能模块 (7)3.1主要的函数 (7)3.2 测试用例及运行结果 (9)第4部分源代码 (12)第5部分总结及参考文献 (18)5.1 总结 (18)5.2 参考文献 (18)第1部分课设简介1.1 课程设计题目磁盘调度算法11.2 课程设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
1)进一步巩固和复习操作系统的基础知识。
2)培养学生结构化程序、模块化程序设计的方法和能力。
3)提高学生调试程序的技巧和软件设计的能力。
4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
1.3 课程设计内容设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。
1、先来先服务算法FCFS2、最短寻道时间优先算法SSTF设计要求:1. 磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。
2. 最好能实现磁道号序列中磁道号的动态增加。
3. 磁道访问序列以链表的形式存储4. 给出各磁盘调度算法的调度顺序和平均寻道长度1.4 时间安排1)分析设计贮备阶段(1 天)2)编程调试阶段(7 天)3)写课程设计报告、考核(2 天)第2部分实验原理分析2.1问题描述1.先来先服务算法 FCFS这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
操作系统课设 磁盘调度算法程序设计

操作系统课设磁盘调度算法程序设计操作系统课设——磁盘调度算法程序设计1:引言1.1 背景1.2 目的和范围1.3 参考文献2:磁盘调度算法概述2.1 磁盘调度的目标2.2 磁盘调度的分类2.3 磁盘调度算法的评价指标3:磁盘调度算法实现3.1 先来先服务(FCFS)算法3.1.1 算法描述3.1.2 算法优缺点3.1.3 算法实现代码示例3.2 最短寻找时间优先(SSTF)算法3.2.1 算法描述3.2.2 算法优缺点3.2.3 算法实现代码示例 3.3 扫描(SCAN)算法3.3.1 算法描述3.3.2 算法优缺点3.3.3 算法实现代码示例 3.4 循环扫描(C-SCAN)算法 3.4.1 算法描述3.4.2 算法优缺点3.4.3 算法实现代码示例 3.5 LOOK算法3.5.1 算法描述3.5.2 算法优缺点3.5.3 算法实现代码示例4:测试与性能评估4.1 测试环境4.2 测试用例设计4.3 对比磁盘调度算法的性能5:结论5.1 结果分析5.2 局限性和未来工作6:附件本文档附带了以下附件:- 磁盘调度算法实现的源代码- 测试用例和数据- 测试结果统计表格7:法律名词及注释7.1 磁盘调度算法:针对磁盘上的存储数据进行调度和访问的算法。
7.2 先来先服务(FCFS)算法:根据请求的到达顺序,依次服务每个请求。
7.3 最短寻找时间优先(SSTF)算法:根据当前磁头位置来寻找最近的请求进行服务。
7.4 扫描(SCAN)算法:磁头从一端开始,向一侧移动并服务请求,直到到达边界,然后返回另一侧。
7.5 循环扫描(C-SCAN)算法:磁头从一端开始,扫描到达边界后回到另一端,重新开始扫描。
7.6 LOOK算法:磁头在服务请求的过程中,只在磁盘上实际存在请求的区域内移动。
操作系统课程设计报告X操作系统课程设计磁盘调度算法

课 程 设 计2007年6月27日设计题目 学 号 专业班级 姓 名 指导教师 磁盘调度算法张栋20042623 信息安全04-01 刘晓平,李琳,路强目录一、摘要 (3)二、算法基本思想描述 (3)2.1 磁盘调度主要思想 (3)2.2 算法描述 (3)三、开发环境 (5)四、重要算法和设计思路描述 (5)五、程序实现---数据结构 (8)六、程序实现---程序清单 (10)6.1源代码 (10)6.2运行结果 (21)七、参考文献 (21)八、总结 (22)一、摘要磁盘调度算法●建立相应的数据结构;●在屏幕上显示磁盘请求的服务状况;●时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位;(b)响应WM_TIMER;(本课程设计采用此方式)●将一批磁盘请求的情况存磁盘文件,以后可以读出并重放;●计算磁头移动的总距离及平均移动距离;●支持算法:FCFS、SSTF、SCAN、CSCAN、FSCAN。
关键字:磁盘调度,FCFS、SSTF、SCAN、CSCAN、FSCAN,MFC编程,Key Words: Disk Schedule; FCFS、SSTF、SCAN、CSCAN、FSCAN,MFC Programming二、算法基本思想描述2.1 磁盘调度主要思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。
操作系统课程设计--磁盘调度算法实践

《操作系统》课程设计磁盘调度算法实践系院:信息工程学院学生姓名:耿万德学号:0934110135专业:计算机科学与技术年级:计科0901B完成日期:2011年12月指导教师:刘栓ave=(float)(sum)/(float)(m);5、实验运行图;算法首页1 先来先服务算法2最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时3 扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时(4)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向内)时4 循环扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时6、实验结果分析;本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。
本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。
用户使用时请注意:1、进入系统,用户根据提示依次输入磁道号,要结束时输入“0”,回车,输入磁盘号结束;2、系统输出你输入的磁道序列,用户核对输入数据3、系统显示系统算法菜单;4、用户选择相应算法,回车;5、系统要求输入当前磁道号,用户输入磁道号,回车;6、系统输出磁头的扫描序列和平均寻道长度;7、用户继续选择系统菜单中的算法;8、当用户选择扫描算法时,需要输入磁道的寻道方向(1表示扫描磁道号大的方向,0表示扫描磁道号小的方向);附:1、课程设计的填写请按格式要求做;2、文字内容宋体、五号、1.5倍行距;3、程序代码字体Times New Roman,五号、1.5倍行距;附表:源程序代码#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) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。
操作系统-磁盘调度算法

操作系统-磁盘调度算法1 一次磁盘读/写操作需要的时间寻找时间(寻道时间)T s:在读/写数据前,需要将磁头移动到指定磁道所花费的时间。
寻道时间分两步:(1) 启动磁头臂消耗的时间:s。
(2) 移动磁头消耗的时间:假设磁头匀速移动,每跨越一个磁道消耗时间为m,共跨越n条磁道。
则寻道时间T s= s + m * n。
磁头移动到指定的磁道,但是不一定正好在所需要读/写的扇区,所以需要通过磁盘旋转使磁头定位到目标扇区。
延迟时间T R:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。
设磁盘转速为r(单位:转/秒,或转/分),则平均所需延迟时间T R=(1/2)*(1/r) = 1/2r。
1/r就是转一圈所需的时间。
找到目标扇区平均需要转半圈,因此再乘以1/2。
传输时间T R:从磁盘读出或向磁盘中写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N,则传输时间T R= (b/N) * (1/r) = b/(rN)。
每个磁道可存N字节数据,因此b字节数据需要b/N个磁道才能存储。
而读/写一个磁道所需的时间刚好是转一圈的时间1/r。
总的平均时间T a= T s+ 1/2r + b/(rN),由于延迟时间和传输时间都是与磁盘转速有关的,且是线性相关。
而转速又是磁盘的固有属性,因此无法通过操作系统优化延迟时间和传输时间。
所以只能优化寻找时间。
2 磁盘调度算法2.1 先来先服务算法(FCFS)算法思想:根据进程请求访问磁盘的先后顺序进行调度。
假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。
按照先来先服务算法规则,按照请求到达的顺序,磁头需要一次移动到55、58、39、18、90、160、150、38、184号磁道。
磁头共移动了 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 146 = 498个磁道。
操作系统课程设计,磁盘调度算法

目录1 课程设计目的及要求……………………………………………………错误!未定义书签。
2 相关知识…………………………………………………………………错误!未定义书签。
3 题目分析 (2)4 概要设计 (2)4.1 先来先服务(FCFS)的设计思想 (2)4.2 最短寻道时间优先调度(SSTF)的设计思想 (2)4.3 扫描算法(SCAN)的设计思想 (2)4.4 循环扫描(CSCAN)的设计思想 (2)5 代码及流程 (3)5.1 流程图 (3)5.2 源代码 (8)6 运行结果 (16)7 设计心得 (19)参考文献 (19)1 课程设计目的及要求设计目的:加深对操作系统原理的进一步认识,加强实践动手能力和程序开发能力的培养,提高分析问题解决问题的能力,培养合作精神,以巩固和加深磁盘调度的概念。
操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求学生的实际动手能力,以加深对所学习内容的理解,使学生熟练地掌握计算机的操作方法,使用各种软件工具,加强对课程内容的理解。
这次课程设计,就是通过模拟磁臂调度来加深对操作系统中磁臂调度概念的理解。
使学生熟悉磁盘管理系统的设计方法;加深对所学各种磁盘调度算法的了解及其算法的特点。
设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)2 相关知识数据结构:数组now:当前磁道号;array[]:放置磁道号的数组;void FCFS(int array[],int m )先来先服务算法(FCFS)void SSTF(int array[],int m)最短寻道时间优先算法(SSTF)void SCAN(int array[],int m) 扫描算法(SCAN)void CSCAN(int array[],int m)循环扫描算法(CSCAN)磁盘调度:当有多个进程都请求访问磁盘时,采用一种适当的驱动调度算法,使各进程对磁盘的平均访问(主要是寻道)时间最小。
磁盘调度算法课程设计

磁盘调度算法课程设计
磁盘调度算法课程设计
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、设计现代操作系统的主要目标是什么?(1)方便性:配置OS后可使计算机系统更容易使用。
(2)有效性:在为配置OS的计算机系统中,诸如CPU、I/O设备等各类资源,都会因经常处于空闲状态而得不到充分利用;外存及内存中所存放的数据由于无序而浪费了存储空间。
(3)可扩充性:OS必须有很好的可扩充性,方能适应发展需求。
OS应采用层次化结构,以便于早呢国家新的功能层次和模块,并能修改老的层次和模块。
(4)开放性:为了使来自不同厂家的计算机和设备能通过网络加以集成化,并能正确、有效的协同工作,实现应用的可移植性和互操作性,必须具有统一的开放环境,进而要求OS具有开放性。
操作系统要能遵循世界标准规范,特别是尊需开放系统互联的OSI过继标准。
2、OS的作用可表现在哪几个方面?从一般用户的观点,可把OS看作是用户与计算机硬件系统之间的接口;从资源管理观点上看,则可把OS视为计算机系统资源的管理者。
(1)OS作为用户与计算机硬件系统之间的接口。
OS处于用户与计算机硬件系统之间,用户通过OS来使用计算机系统。
用户在OS的帮助下,能够方便、快捷、安全、可靠的操作计算机硬件和运行自己的程序。
(2)OS作为计算机系统资源的管理者。
OS的主要功能是针对处理器、存储器、I/O设备以及信息这四类资源进行管理,即:处理器管理,用于分配和控制处理机;存储管理,主要负责内存的分配与回收;I/O设备管理,负责I/O设备的分配与操纵;文件管理,负责文件的存取、共享和保护。
(3)OS用作扩充机器。
通常把覆盖了软件的机器称为扩充机器或虚拟机。
5、试说明推动分时系统形成和发展的主要动力是什么?推动多道批处理系统形成和发展的主要动力,是提高资源利用率和系统吞吐量;推动分时系统形成和发展的主要动力,是为了满足用户的需求。
用户的具体需求有:(1)人——机交互;(2)共享主机;(3)便于用户上机。
9、OS有哪几大特征?其基本的特征是什么?OS有四大特征,分别是并发、共享、虚拟和异步。
操作系统课程设计-磁盘调度

计算机操作系统课程设计设计说明书磁盘调度算法的实现与分析学生姓名班级学号成绩指导教师(签字)计算机与通信学院目录1 课程设计简介 (3)1.1 课程设计的目的 (3)1.2 课程设计内容 (3)1.2.1 先服务FCFS (First Come First Server) (3)1.2.2最短寻道时间优先SSFT (Shortest Seek Time First) (3)1.2.3 SCAN (4)1.2.4 C-SCAN (5)2 数据结构的设计 (6)2.1 数据结构的设计理念 (6)2.2 数据结构的详细设计 (6)2.2.1 FCFS策略 (6)2.2.2 SSTF策略 (6)2.2.3 SCAN策略 (7)2.2.4 C_SCAN策略 (7)3 功能模块(或算法)描述 (8)3.1 排序模块(流程图) (8)3.1.1 SSTF策略 (8)3.1.2 SCAN策略 (8)3.1.3 C_SCAN策略 (9)3.2 求移动的磁道数模块(流程图) (9)4 程序运行结果 (11)4.1 FCSF策略的运行结果 (11)4.2 SSTF策略的运行结果 (11)4.3 SCAN策略的运行结果 (12)4.4 C_SCAN策略的运行结果 (12)5、心得体会 (13)参考文献 (14)附源代码 (15)附录一:FCFS策略 (15)附录三:SCAN策略 (16)附录四:C_SCAN策略 (18)1 课程设计简介1.1 课程设计的目的使学生熟悉磁盘管理系统的设计方法;加深对所学各种磁盘调度算法的了解及其算法的特点。
主要对FCFS(先来先服务),SSTF(最短寻道时间优先),SCAN(电梯调度算法),C-SCAN(循环调度算法)这几种磁盘调度的算法分析和实现。
1.2 课程设计内容1.2.1 先服务FCFS (First Come First Server)这是最简单的磁盘调度策略,它根据进程请求访问磁盘的时间顺序进行调度。
操作系统课程设计-磁盘调度算法

操作系统课程设计-磁盘调度算法前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是: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、需求分析4课题描述 4课题目的4理论依据72、概要设计8设计方法8技术8运行环境83、详细设计9流程图11程序主要代码134、运行结果及分析14运行结果15结果详细分析165、总结和心得166、参考文献177、附录:程序源代码231、需求分析课题描述这次课程设计我研究的题目是:磁盘调度算法。
具体包括三种算法分别是:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(电梯调度算法)(SCAN)。
课题目的通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,扫描SCAN算法的实现方法。
理论依据设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。
因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是: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)2. 课程设计任务及要求2.1 设计任务1.熟悉并掌握磁盘调度算法管理系统的设计方法,加强对所学各种调度算法及相应算法的特点了解。
2.掌握磁盘调度的基本概念,深刻体会各个算法的优缺点,以及算法间的相似点。
2.2 设计要求1)定义与算法相关的数据结构,如PCB、队列等;2)实现2种不同的调度算法(可使用伪代码或流程图进行分析);3)算法执行结束时,应给出总的寻道长度;4)磁道访问序列随机生成,且要满足一定的数量要求(不少于100个);5)系统实现必须提供一定的交互性,所需测试数据应当以文件形式提供或者由用户在测试过程中给出,不可将测试数据“写死”在系统实现代码中;6)必须给出足够的注释,注释量不得少于代码量的一半;7)对于系统中所使用到的系统调用(API函数),必须给出函数的定义原型、使用方法,参数较为复杂的,还应该给出参数的具体描述;3. 算法及数据结构3.1算法的总体思想(流程)3.2 实现过程中用到的数据结构 1.最短寻道时间优先(SSTF)图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 指向当前磁道号,计算寻道长度sum 。
将当前磁道号与剩余没有访问的磁道号进行比较,重复上述操作。
并计算平均寻道长度ave 。
3839 3955 55 5558 58 58 5890 90 90 90 90 now值: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 184 160 160 160 160 160 150 150 150 150 150 150 now值: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.1 最短寻道时间优先算法(SSTF )模块4.1.1程序流程图磁盘调度算法模拟系统最短寻道时间优先扫描算法退出4.1.2 程序说明算法分析①优点:相较于先来先服务算法(FCFS)有更好的寻道性能,使每次的寻道时间最短。
缺点:易造成某个进程发生“饥饿”现象。
②最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。
例如,如果现在读写磁头正在100号柱面上执行输出操作,而等待访问者依次要访问的柱面为55,58,39,18,90,160,150,38,184,那么,当100号柱面的操作结束后,应该先处理90号柱面的请求,然后到达58号柱面执行操作,随后处理55号柱面请求,后继操作的次序应该是39,38,18,150,160,184.采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,具有更好的寻道性能,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。
但最短查找时间优先(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;}4.2扫描算法(SCAN)模块4.2.1 程序流程图4.2.2 程序说明算法分析①优点:排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。
缺点:新进来的访问此磁道的进程的请求会被大大地推迟。
增加延迟。
②SCAN 算法又称电梯调度算法。
SCAN算法是磁头前进方向上的最短查找时间优先算法。
注:“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。
这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客张一、张二、张三在等候乘电梯。
他们的要求是:张一在2层等待去10层;张二在5层等待去底层;张三在8层等待去15层。
由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张三从8层带到15层,然后电梯换成下行方向,把乘客张二从5层带到底层,电梯最后再调换方向,把乘客张一从2层送到10层。
我们仍用前述的同一例子来讨论采用“电梯调度”算法的情况。
由于磁盘移动臂的初始方向有两个,而该算法是与移动臂方向有关,所以分成两种情况来讨论。
这里是:移动臂先由里向外移动,再由外向里移动。
开始时,,在100号柱面执行操作的读写磁头的移动臂方向是由里向外,趋向32号柱面的位置,因此,当访问100号柱面的操作结束后,沿臂移动方向最近的柱面是150号柱面。
所以应先为150号柱面的访问者服务,然后是为160号柱面的访问者服务。
之后,由于在向外移方向已无访问等待者,故改变移动臂的方向,由外向里依次为各访问者服务。
在这种情况下为等待访问者服务的次序是184,90,58,55,39,38,18。
③算法流程:输入磁头初始磁道号,序列长度,磁道号序列。
选择磁盘调度算法(最短寻道时间优先调度(SSTF))或(扫描调度算法(SCAN))中的任意一个,若选择SCAN,则需要选择磁头移动方向是“向磁道号增加方向访问”或“向磁道号减少方向访问”,之后,输出各进程被调度的顺序,并计算总的寻道长度和平均寻道长度,选择关闭则结束磁盘调度。
4.2.3 程序关键代码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.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<<" 磁盘距离最近,以使每次的寻道时间最短。