第五讲 磁盘调度算法
磁盘调度算法系统设计

磁盘调度算法系统设计磁盘调度算法是操作系统中的一个重要组成部分,它负责决定磁盘上的数据读取和写入的顺序,以提高磁盘的读写效率。
在设计一个磁盘调度算法系统时,需要考虑多个因素,包括磁盘的物理结构、磁盘访问请求的特点以及性能需求等。
一、磁盘的物理结构磁盘由多个磁道和扇区组成,每个磁道上有多个扇区,扇区是磁盘上最小的读写单位。
在磁盘调度算法系统设计中,需要了解磁盘的物理结构,以便根据磁盘的特点来选择合适的调度算法。
例如,对于磁盘的顺序访问速度较快,而随机访问速度较慢,因此在设计调度算法时需要考虑如何减少随机访问的次数,提高磁盘的读写效率。
二、磁盘访问请求的特点磁盘访问请求通常包括读请求和写请求,读请求是指从磁盘中读取数据,写请求是指向磁盘中写入数据。
在设计调度算法时,需要考虑磁盘访问请求的特点,以便根据不同的请求类型采取不同的调度策略。
例如,对于读请求,可以采取先来先服务(FCFS)的调度算法,即按照请求的到达顺序进行调度;对于写请求,可以采取最短寻道时间优先(SSTF)的调度算法,即选择距离当前磁头位置最近的请求进行调度。
三、性能需求磁盘调度算法的设计还需要考虑性能需求,包括响应时间、吞吐量和磁盘利用率等方面。
响应时间是指从请求发出到完成的时间,吞吐量是指单位时间内完成的请求数量,磁盘利用率是指磁盘的有效工作时间占总时间的比例。
在设计调度算法时,需要权衡这些性能指标,选择合适的调度策略。
例如,对于要求响应时间较短的任务,可以采用最短寻道时间优先(SSTF)的调度算法;对于要求吞吐量较高的任务,可以采用电梯调度(SCAN)算法,以提高磁盘的读写效率。
四、调度算法的选择在设计磁盘调度算法系统时,需要根据具体的应用场景选择合适的调度算法。
常见的磁盘调度算法包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯调度(SCAN)和循环扫描(C-SCAN)等。
不同的算法适用于不同的场景,例如,FCFS适用于请求到达时间间隔较长的场景,SSTF适用于请求到达时间间隔较短的场景,SCAN适用于读写请求较为均衡的场景,C-SCAN适用于读写请求较为不均衡的场景。
磁盘调度算法的模拟实现

磁盘调度算法的模拟实现磁盘调度算法是指操作系统中负责管理物理磁盘的一种算法,其主要目的是优化磁盘访问,提高磁盘效率。
常见的磁盘调度算法有FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)、C-SCAN(循环扫描)等。
下面我将分别介绍这几种算法的模拟实现。
1.FCFS(先来先服务)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。
然后,将用户请求的磁道号加入队列中,按照先来先服务的原则进行服务,即按照队列中的请求顺序依次访问磁盘。
计算总体访问时间等信息,并输出结果。
2.SSTF(最短寻道时间优先)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。
然后,从当前磁头位置开始,找到与当前位置距离最近的请求磁道号,计算距离最小的请求所在的队列位置,并将该请求从队列中取出访问磁盘。
重复上述过程,直至队列为空。
计算总体访问时间等信息,并输出结果。
3.SCAN(扫描)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。
然后,将用户请求的磁道号加入队列中,并将队列按磁道号从小到大排序。
假设当前磁头位置为start,将磁头移动到队列中第一个比start大的磁道号,然后按照顺时针方向继续移动,直至访问队列中最大的磁道号。
然后,改变移动方向,回到队列中最小的磁道号为止。
计算总体访问时间等信息,并输出结果。
4.C-SCAN(循环扫描)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。
然后,将用户请求的磁道号加入队列中,并将队列按磁道号从小到大排序。
假设当前磁头位置为start,将磁头移动到队列中第一个比start大的磁道号,然后按照顺时针方向继续移动,直至访问队列中最大的磁道号,并将磁头移动到队列中最小的磁道号。
计算总体访问时间等信息,并输出结果。
以上是对于不同磁盘调度算法的简要模拟实现。
在实际应用中,还需要考虑更多的细节,如怎样处理新到的请求、队列的管理等。
磁盘调度算法

文件系统的物理基础是磁盘存储设备。所以, 文件系统的物理基础是磁盘存储设备。所以, 磁盘存储器的服务效率很重要, 磁盘存储器的服务效率很重要,为了提高文件 系统的性能,我们必须对磁盘进行合理的管理 系统的性能, 、调度,对磁盘调度算法进行优化。 调度,对磁盘调度算法进行优化。
第五章 磁盘存储器管理
第五章 磁盘存储器管理
2012-5-2
17
总结: 总结:
1. 先来先服务 . 2. 最短寻道时间优先 最短寻道时间优先(SSF) 3. 扫描算法(电梯算法) 扫描算法(电梯算法) 4 .循环扫描调度算法 循环扫描调度算法
5. N-Step-SCAN和FSCAN调度算法 了解 和 调度算法(了解 调度算法 了解)
第五章 磁盘存储器管理 2012-5-2 4
1. 先来先服务 .
按访问请求到达的先后次序服务 优点:简单,公平; 优点:简单,公平; 缺点:效率不高, 缺点:效率不高,相邻两次请求可 能会造成最内到最外的柱面寻道, 能会造成最内到最外的柱面寻道,使 磁头反复移动,增加了服务时间, 磁头反复移动,增加了服务时间,对 机械也不利
第五章 磁盘存储器管理 2012-5-2 5
例
假设磁盘访问序列: , 假设磁盘访问序列:98,183,37,122, , , , 14,124,65,67。移动臂的运动方向:沿 , , , 。移动臂的运动方向: 磁道号递减的方向移动。 磁道号递减的方向移动。 读写头起始位置: 读写头起始位置:53 1) (1)安排磁头服务序列 (2)计算磁头移动总距离(道数) )计算磁头移动总距离(道数)
课后任务: 课后任务:为了更好的掌握本节课所学的内 请大家完成书后习题6的第 小题。 的第12小题 容。请大家完成书后习题 的第 小题。
浅谈磁盘调度算法PPT课件

5.LOOK调度&C-LOOK调度
与SCAN和C-SCAN相似,但是磁头只移动到一个方向上最远的请 求为止,接着,它马上回头,而不是继续到磁盘的尽头。因为它们在 朝一个方向移动会看(look)是否有请求,故以此命名。
2020/2/16
7
三 例题展示
先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求
都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,
此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各
进程得到服务的响应时间的变化幅度较小。
2020/2/16
对于任何调度算法,其性能主要依赖于请求的数量和类型。
2020/2/16
10
谢谢观看!
2020/2/16
11
2020/2/16
12
2020/2/16
13
3
二 常用调度算法概述
2 .最短寻道时间优先算法(SSTF)
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁
道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞
吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求
的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务
请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有
些请求的响应时间将不可预期。
2020/2/16
4
二 常用调度算法概述
3、扫描算法(SCAN)电梯调度
磁臂从磁盘的一端向另一端移动,同时当磁头移过每个柱面时, 处理位于该柱面上的服务请求。当到达另一端时,磁头改变移动方向, 处理继续,磁头在磁盘上来回扫描。由于这种算法中磁头移动的规律 颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短 寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺 点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时 间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于 中间磁道。
操作系统课程设计-磁盘调度算法

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

磁盘调度算法 -电脑资料2019-01-01磁盘优点容量很大每位的价格非常低当关掉电源后存储信息不丢失物理特性磁盘表面覆盖着磁性物质,信息记录在磁表面上,。
固定头磁盘的每个磁道单独有一个磁头,这样就能使得计算机可以很快地从一个磁道转换到另一个磁道。
但是这需要大量的头,设备成本很高。
更通用的方式是每个盘面只有一个头,让它从一道移向另一道。
这种动头设备需要硬件设备移动头。
磁盘一般用于文件存储,设计原则是:成本低、容量大、速度高。
扩大存储容量:a.增加每英寸磁道数目; b. 双面记录。
存取盘块中的信息一般要有三部分时间:系统首先要把磁头移到相应的道上或柱面上,这个时间叫做寻道时间;一旦磁头到达指定磁道,必须等待所需要的扇区转到读/写头下,这个延迟时间叫做旋转延迟时间;最后,信息实际在磁盘和内存之间进行传送也要花费时间,这部分时间叫做传送时间。
一次磁盘服务的总时间就是这三者之和。
要使磁盘服务尽可能地快,操作系统要提供合适的调度算法,改善磁盘服务的平均时间。
进程需要和磁盘交换信息时必须要操作系统发出系统调用,对磁盘的请求一般要有下述几部分内容:1. 输入和输出;2. 磁盘地址(驱动器、柱面、面号、扇区);3. 内存地址;4. 传送长度。
磁盘调度算法1、先来先服务调度(FCFS)FCFS 算法是优先为最先到达的请求服务。
例如,有如下请求磁盘服务队列,要访问的磁道数分别是:98,183,37,122,14,124,65,67排在前面的是先到达的请求,假设磁头目前停留在53磁道上,按照先来先服务的算法,接下来磁头的移动顺序依次是:53—>98—>183—>37—>122—>14—>124—>65—>67这个过程总共移动了(98-53)+(183-98)+(183-37)+(122-37)+(122-14)+(124-14)+(124-65)+(67-65)=640个磁道这种调度法产生的磁头移动服务太大,磁头频繁的大幅度移动,容易产生机械振动和误差,对使用寿命有损害。
磁盘调度算法简述

磁盘调度算法简述⼀⼂意义:良好的调度算法,能减少IO读取时间(磁盘读取(最慢)+读取+传输)磁盘访问时间=寻道时间+旋转延迟时间+数据传输时间,磁盘读写顺序:由上直下(柱⾯磁道),由外到⾥(柱⾯排序,外磁道速度最快),依次访问对应扇区(512bytes)计算机中,各存储区域访问速度为寄存器约等号≈cache>内存>>磁盘>其他外接物理设备系统每进⾏⼀次IO中断,进⾏数据读写,⾸先要进⾏命中测试,若不在register,cache,memory中,则进⾏磁盘读取,先寻址,再进⾏io读⼊内存,读⼊后才能被cpu使⽤。
由磁盘中读写数据占⽤时间公式可知,其最主要的是寻道时间,旋转延迟时间,良好的磁盘调度算法,能减少IO读写时间,从⽽减少进程等待io时间,增加cpu利⽤率,防⽌磁臂黏着现象的发⽣。
⼆⼂名词解释:1)磁臂粘着--------程序对某些磁道频繁访问,如多次访问同⼀磁道,则io队列中,多次对同⼀磁道进⾏频繁的读取,导致其他磁道的请求被搁置,即为磁臂黏着现象(类似于进程饿死)2)寻道时间:移动磁臂到对应磁道(⼀般全部磁臂同时移动,部分可以分别移动),最慢3)旋转延迟时间:磁盘旋转到对应扇区,对应磁柱进⾏读写4)数据传输时间:读取数据,使⽤IO总线传⼊内存供cpu使⽤三⼂算法简述1.先来先服务算法(FCFS)----FirstComeFirstServer可使⽤链表(若有数量上限则单设头结点记录请求数,超出则拒绝)和数组(数组长度限制为请求数量,防⽌越界),依据请求时间先后,对io请求进⾏队列排列,依次出队优劣:公平、简单;平均寻道时间可能较长2.最短寻道算法(SSTF)其访问规则为距离当前磁头最近的io请求进⾏服务,由“最近”⼀词和磁盘读写顺序可知,其可能会返回对⼀个柱⾯的磁道进⾏多次读写,造成磁盘黏着现象基本实现:动态处理IO请求,可使⽤链表(双向链表,避免越界和前置判空操作)或者数组(内存允许则最好⽤数组,减少寻址时间)实现,使⽤插⼊排序算法,对IO请求进⾏动态排序,指针p指向磁头的当前磁道和扇区对应的线形距离数字,对前置后驱元素进⾏判定,以距离较短者作为下次磁盘访问对象。
磁盘的调度算法探究

磁盘的调度算法探究
磁盘调度算法是指在计算机存储系统中优化磁盘性能的算法,它根据访问请求的索引项分配磁头时间,并决定将物理磁头移动到正确的磁道的位置。
磁盘调度算法的探究主要集中在几个方面,如磁盘性能评估、寻道算法、等待时间分析和改进算法等。
1. 磁盘性能评估:磁盘性能评估是指从磁盘性能方面评估不同调度算法的差异,可以根据性能指标(如响应时间、利用率、最大等待时间等)更好地评估磁盘调度算法。
2. 寻道算法:寻道算法是指在磁盘调度调度中定位磁头寻找数据的算法。
寻道算法一般分为两类:经典算法(FCFS、SSTF、SCAN等)和改进算法(如NO-SEEK、MCT等)。
它们的不同之处在于计算磁头行进距离的方式,经典算法一般采用距离计算公式,而改进算法则更关注访问模式。
3. 等待时间分析:等待时间是指用户在发出请求后到请求被执行的时间。
等待时间分析是指从磁盘性能角度分析不同调度算法的等待时间,以期提高磁盘的响应性能。
4. 改进算法:改进算法是指在原有调度算法的基础上改进而来的新算法,它具有较好的性能,可以增强系统的处理能力,并满足用户的需求。
第五章_磁盘移臂调度算法

共移动120柱面
(0+4+24+8+8+72+4)*3=120*3=360 ms
(3)电梯调度算法: 由于未指明开始移动的方向,分成两种情形: OUT:
40 → 40 → 20 → 12 → 4 → 44 ) (40) (32) (4)
其中进程是按其发出 进程号 磁道号 移动距离(磁道数) 请求的先后顺序排列的。 4 19 81 9 376 357 采用的是FCFS调度策略。 23 205 171 完成这组I/O操作需移动 7 134 71 磁头的总距离为1604磁道。 34 18 116 22 56 38 优点: 公平、简单,且 14 192 136 每个进程的请求都能依次 3 396 204 32 29 367 得到处理,不会出现某进 17 3 26 程的请求长期得不到满足 12 19 16 29 40 21 的情况。 磁头移动的总距离=1604 (磁道) 缺点:与后面讲的几种 调度算法相比,其平均寻道距离较大。故此算法仅 适用于请求磁盘上的进程数较少的场合。
2 FSCAN算法 FSCAN算法实质上是N-Step-SCAN算法 的简化。它只将磁盘请求访问队列分成两个 子队列。 一是当前所有请求磁盘I/O的进程形成的 队列,由磁盘调度按SCAN算法进行处理。 另一个队列则是在扫描期间,新出现的 所有请求磁盘I/O进程的队列,把它们排入另 一个等待处理的请求队列。 这样,所有的新请求都将被推迟到下一 次扫描时处理。
一、先来先服务FCFS
(First-Come, First-Served)
这是一种最简单的磁盘调度算法。它根 据进程请求访问磁盘的先后次序进行调度。
操作系统实验 第五讲 磁盘调度算法讲课讲稿

操作系统实验第五讲磁盘调度算法操作系统实验报告哈尔滨工程大学计算机科学与技术学院第六讲磁盘调度算法一、实验概述1. 实验名称磁盘调度算法2. 实验目的(1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;(2)观察 EOS 实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法;(3)编写 CSCAN和 N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3. 实验类型验证性+设计性实验4. 实验内容(1)验证先来先服务(FCFS)磁盘调度算法;(2)验证最短寻道时间优先(SSTF)磁盘调度算法;(3)验证SSTF算法造成的线程“饥饿”现象;(4)验证扫描(SCAN)磁盘调度算法;(5)改写SCAN算法。
二、实验环境在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。
三、实验过程1. 设计思路和流程图(1)改写SCAN算法在已有 SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。
算法流程图如下图所示。
图 3.1.1 SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside确定磁头移动的方向,而是规定磁头只能从外向内移动。
当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。
算法流程图如下图所示。
图 3.1.2 CSCAN算法IopDiskSchedule函数流程图(3)编写N-Step-SCAN磁盘调度算法在已经完成的 SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为 N 的子队列,调度程序按照 FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。
磁盘调度算法FCFS、SSTF、SCAN、CSCAN

磁盘调度算法FCFS、SSTF、SCAN、CSCAN 为了减少对⽂件的访问时间,应采⽤⼀种最佳的磁盘调度算法,以使各进程对磁盘的平均访问时间最少。
由于在访问磁盘时主要是寻道时间。
因此,磁盘调度的⽬标是使磁盘的平均寻道时间最少。
如磁道请求队列为55、58、39、18、90、160、150、38、184,从100号开始。
⼀.先来先服务(FCFS)1.⽅法 根据进程请求访问磁盘的先后顺序进⾏调度。
2.优点 公平、简单、每个进程请求都能依次得到处理,不会出现某⼀进程的请求长期得不到满⾜。
缺点 3.缺点 平均寻道时间有点长,适⽤于磁盘I/O进程数⽬较少的场合。
4.举例 如磁道请求队列为55、58、39、18、90、160、150、38、184.⼆.最短寻道时间优先(SSTF)1.⽅法 其要求访问的磁道与当前磁头所在的磁道距离最近。
2.缺点 优先级低的进程会发⽣“饥饿”现象。
因为新进程请求到达,且其所要访问的磁道与磁头当前所在的磁道距离较近,必先优先满⾜。
3.举例 如磁道请求队列为55、58、39、18、90、160、150、38、184.三.扫描算法(电梯调度算法)(SCAN)1.⽅法 1.⾸先⾃⾥向外访问,下⼀个对象是其欲访问的磁道既在当前磁道之外,⼜是距离最近的; 2.直⾄⽆更外的磁道需要访问时,才将磁臂换向为⾃外向⾥移动; 3.下⼀个访问的磁道在当前位置内为距离最近者;直⾄再⽆更⾥⾯的磁道要访问。
2.优点 不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑了磁头当前的移动⽅向;避免了出现“饥饿”现象。
被⼴泛⽤于⼤、中、⼩型机器和⽹络中的磁盘调度。
3.缺点 当磁道刚从⾥向外移动⽽越过了某⼀磁道时,刚好⼀进程请求访问此磁道,这时此进程会等待,待磁头继续从⾥向外,然后从外向⾥扫描完处于外⾯的所有要访问的磁道后,才处理此进程,致使该进程的请求被⼤⼤推迟。
4.举例 如磁道请求队列为55、58、39、18、90、160、150、38、184.四.循环扫描算法(CSCAN)1.⽅法 1.⾸先⾃⾥向外访问,当磁头移到最外的磁道并访问后,磁头返回到最⾥的欲访问磁道,即将最⼩磁道号紧接着最⼤磁道号构成循环,继续循环扫描 2.直⾄⽆更外的磁道需要访问时,才将磁臂换向为⾃外向⾥移动; 3.下⼀个访问的磁道在当前位置内为距离最近者;直⾄再⽆更⾥⾯的磁道要访问。
磁盘调度算法的实现

实验五、磁盘调度算法的实现一、实验目的实验程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN 算法的工作过程。
假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m 和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度,本程序采用随机数来产生磁道数。
二、实验要求算法所需的各种参数由输入产生(手工输入或者随机数产生)。
最后的结果要求是在运行四种算法的程序后,能够输出调度过程、平均寻道长度的正确结果。
三、实验说明(1) 先来先服务.(FCFS):这是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
(2) 最短寻道时间优先(SSTF):该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
(3) 扫描算法(SCAN):SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
(4)循环扫描算法(CSCAN)CSCAN算法是对扫描算法的改进。
如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
操作系统-磁盘调度算法

操作系统-磁盘调度算法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个磁道。
磁盘调度算法及模拟

磁盘调度算法及模拟磁盘调度算法是操作系统中用于管理磁盘访问请求的一种机制,其目的是优化磁盘的访问速度和效率。
磁盘调度算法主要考虑如何按照一定的规则来调度磁盘上的读写请求,以尽可能减少磁头的移动距离和等待时间,提高磁盘的访问性能。
常见的磁盘调度算法包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯调度算法(SCAN)、循环扫描算法(C-SCAN)和最短期望时间优先(C-LOOK)等。
1.先来先服务(FCFS)算法:按照请求的顺序处理磁盘访问请求,效率较低。
2.最短寻道时间优先(SSTF)算法:始终选择离当前磁头位置最近的请求进行处理,减少磁头的移动距离。
但容易造成一些请求长时间等待。
3.电梯调度算法(SCAN):磁头按照其中一方向(例如柱面号增大)移动,直到到达磁道的最边缘,然后改变方向继续移动。
这样可以使得距离较远的磁头请求较少等待时间,但在磁头改变方向时可能造成一些请求需要等待。
4.循环扫描算法(C-SCAN):与SCAN类似,但在到达磁道最边缘后,直接返回到最开始的磁道继续扫描。
这样可以减少等待时间,但请求之间可能存在不公平的情况。
5.最短期望时间优先(C-LOOK)算法:磁头按照其中一方向移动,直到扫描完所有请求,然后返回最开始的磁道重新扫描。
这种方式减少了等待时间,并且使请求公平地被处理。
下面对磁盘调度算法进行模拟:假设磁盘上有一系列的读写请求,我们可以随机生成一些磁道号来模拟这些请求。
假设磁头的初始位置在1号磁道,我们可以使用Python编程语言实现一个简单的模拟算法。
```pythonimport random#初始化请求队列request_queue = []for _ in range(10):request_queue.append(random.randint(1, 100))#初始化磁头位置和移动方向head = 1direction = 1#使用SCAN算法进行模拟total_distance = 0while request_queue:#寻找离当前磁头位置最近的请求nearest_request = min(request_queue, key=lambda x: abs(x - head))#计算磁头移动距离,并更新磁头位置distance = abs(nearest_request - head)head = nearest_request#累计移动距离total_distance += distance#处理请求request_queue.remove(nearest_request)#打印相关信息print('磁头移动到磁道{},移动距离为{}'.format(nearest_request, distance))print('总移动距离为:', total_distance)```以上为一个简单的模拟算法,随机生成10个磁道号作为请求,模拟使用SCAN算法进行调度。
C语言磁盘调度算法

C语言磁盘调度算法1.FCFS(先来先服务)算法:FCFS算法按照磁盘请求的顺序进行调度,即按照先来先服务的原则,先处理先到达磁盘的请求。
它的实现非常简单,只需要按照请求的顺序进行访问即可。
C代码示例:```c#include <stdio.h>#include <stdlib.h>int fcfs(int start, int *requests, int n)int i;int total = abs(start - requests[0]);for (i = 1; i < n; i++)total += abs(requests[i] - requests[i - 1]);}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = fcfs(start, requests, n);printf("Total head movement: %d\n", total);return 0;```2.SSTF(最短寻道时间优先)算法:SSTF算法每次都选择离当前磁道最近的请求进行处理,以减少寻道时间。
具体实现时,需要计算每个请求到当前磁道的距离,并选择最小的距离进行处理。
C代码示例:```c#include <stdio.h>#include <stdlib.h>int sstf(int start, int *requests, int n)int i, j;int total = 0;int visited[n];for (i = 0; i < n; i++)visited[i] = 0;}int cur = start;for (i = 0; i < n; i++)int minDist = __INT_MAX__;int index = -1;for (j = 0; j < n; j++)if (!visited[j])int dist = abs(cur - requests[j]); if (dist < minDist)minDist = dist;index = j;}}}total += minDist;visited[index] = 1;cur = requests[index];}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = sstf(start, requests, n);printf("Total head movement: %d\n", total);return 0;```3.SCAN(电梯算法)算法:SCAN算法模拟电梯的运行方式,先向一个方向扫描直到末尾,然后再改变方向向另一个方向扫描,以此往复。
操作系统课程设计-磁盘调度算法

操作系统课程设计-磁盘调度算法前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是: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)有更好的寻道性能,使每次的寻道时间最短。
操作系统磁盘调度算法

操作系统磁盘调度算法磁盘调度算法的作用在计算机系统中,磁盘是一个重要的存储设备,而磁盘调度算法则是管理磁盘读写请求的关键操作之一。
磁盘调度算法可以使磁盘的读写时间最小,提高磁盘的利用率,保证磁盘的可靠性。
常见的磁盘调度算法先来先服务(FCFS)先来先服务是一种简单、易于实现的磁盘调度算法。
它将磁盘请求队列中的请求按照队列顺序进行服务,即磁盘读写请求按照先来先服务的原则被服务。
例如,如果请求队列为1,2,3,4,5,则磁头先会寻找1,完成后再寻找2,以此类推。
当然,这种算法会存在“饥饿”现象,即后面的请求需要等待前面的请求完成后才能获得服务。
最短寻道时间优先(SSTF)SSTF是一种比FCFS更优秀的算法,它选择离当前磁头位置最近的请求为下一个服务对象。
这种算法的好处在于,可以减少磁头的寻道时间。
例如,如果当前磁头在请求队列的3个请求2, 5和8的中间位置,则SSTF会选择请求2,这样会比选择5或8更快地完成磁盘读写。
扫描算法(SCAN)扫描算法,也称电梯算法,是一种沿着磁道的方向移动磁头的算法。
在扫描算法中,磁头在一个方向上移动,直到到达最边缘,然后开始沿着相反的方向移动,直到服务完整个队列。
例如,如果磁头的移动方向是向“外”(即向磁道号增大的方向),磁头将服务最小的请求,然后继续向下寻找。
当磁头到达队列的最大值后,再继续向“内”折回。
这种算法将会循环操作队列,直到完成服务。
循环扫描算法(C-SCAN)循环扫描算法是一种改进版的SCAN算法,它将SCAN算法改进成了一个环形的磁盘,在这个环形的磁盘上磁头运动方向是单向的。
与SCAN算法不同的是,当读写头到达一端时,它不会立即返回而是重新回到另一端继续扫描。
例如,一旦磁头到达队列的最大值,它会马上返回队列的最小值,这样可以更好地利用闲置时间服务队列。
磁盘调度算法的选择在实际应用中,选择适当的磁盘调度算法对于磁盘性能有着至关重要的影响。
FCFS算法简单但性能一般,SSTF算法寻找最近请求可提高系统性能,SCAN和C-SCAN算法可以处理高负载的读写请求。
磁盘调度算法

举例: 若磁头的当前位置为 72 磁道,磁头正向磁 道增加方向移动。现有一磁盘读写请求队列 98 , 220,37,122,14,124,65,82,试计算出采 用下列不同算法的平均寻道长度各为多少? (1)FCFS算法 (2)SSTF算法 (3)SCAN算法 (4)CSCAN算法
解:(1)FCFS算法 从72磁道开始
下一磁道 98 220 37 122 14 124 65 82 移动磁道数 26 122 183 85 108 110 59 17
平均寻道长度=710/8=89.75
解:(2)SSTF算法 从72磁道开始
下一磁道 65 82 98 122 124 37 14 220 移动磁道数 7 17 16 24 2 87 23 206
3.扫描算法(SCAN)
在磁头移动方向上选择与当前磁头所在的磁 道距离最近的请求作为下一次服务的对象。 优点:
(1)具有较好的寻道性能;
(2)避免了饥饿现象
缺点: 不利于远离磁头一端的访问请求。
Hale Waihona Puke 4.循环扫描算法(CSCAN)
是对扫描算法(SCAN)的改良,它规定磁头 单向移动,例如自内向外移动,当磁头移动到 最外磁道时立即又返回到最内磁道,如此循环 进行扫描。
磁盘调度算法 磁盘调度算法有若干种,但着眼点都放在 寻道优化上,即寻道时间尽量短,吞吐量尽量 大。目前广泛使用的寻道策略有下列几种:
1.先来先服务寻道算法(FCFS):
按进程请求访问磁盘的先后次序进行调度。
特点:合理、简单、但未对寻道进行优化。
2 .最短寻道时间优先算法(SSFT , ShortestSeek-Time-First) 选择与当前磁头所在的磁道距离最近的请求 作为下一次服务的对象。 缺点: (1)不能保证平均寻道时间最短; ( 2 )可能会使某些请求总得不到服务(又 称饥饿)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称磁盘调度算法2. 实验目的1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。
2)观察EOS 实现的FCFS、SSTF 和SCAN 磁盘调度算法,了解常用的磁盘调度算法。
3)编写CSCAN 和N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。
3. 实验类型验证+设计4. 实验内容1)准备实验2)验证先来先服务(FCFS)磁盘调度算法;3)验证最短寻道时间优先(SSTF)磁盘调度算法;4)验证SSTF算法造成的线程“饥饿”现象;5)验证扫描(SCAN)磁盘调度算法;6)改写SCAN算法。
7)编写循环扫描(CSCAN )磁盘调度算法8)验证SSTF、NSCAN及NCSCAN算法中的“磁臂粘着”现象9)编写N- Step-NSCAN磁盘调度算法二、实验环境操作系统:Windows操作系统编译器:集成开发环境OS Lab语言:C语言三、实验过程1. 需要解决的问题及解答1)实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。
答:先来先服务(FCFS)磁盘调度算法输出结果如下:2)实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果答:最短寻道时间优先(SSTF)磁盘调度输出结果如下:3)实验指导P178-3.4验证SSTF算法造成的线程“饥饿”现象,要求请给出在“输出”窗口中的结果。
答:修改ConsoleCmdDiskSchedule函数,使磁头初始停留在磁道10,让其它线程依次访问磁道78,21,9,8,11,41,10,67,12,10;在OS Lab 的输出窗口显示线程调度的信息:可以看到访问78号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“饥饿”现象。
4)实验指导P179-3.5验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》P176-3.2节中的数据)和饥饿(即《实验指导》P178-3.4节中的数据)请给出在“输出”窗口中的结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。
答:SCAN算法可以防止老线程出现“饥饿”现象,使用scan.c文件提供的IopDiskSchedule函数替换block.c文件中的IopDiskSchedule函数,生成项目,启动调试,在控制台运行“ds”命令。
在控制台中按线程被阻塞的顺序依次显示线程的信息:在OS Lab的输出窗口显示线程调度的信息:第二次运行“ds”命令,线程调度顺序发生改变:磁盘调度顺序发生改变的原因是ScanInside默认值为TRUE,但在第一次“ds”运行结束后,ScanInside更改为FALSE,即寻道方向发生改变。
5)按照《实验指导》的P179-3.6改写SCAN算法,编写代码。
要求至少给出源代码、解释及运行结果。
答:源代码、解释与运行结果分别在第2、3小题中。
2. 源程序并附上注释1)改写SCAN算法PREQUEST IopDiskSchedule(VOID){PLIST_ENTRY pListEntry;PREQUEST pRequest;PREQUEST INpNextRequest = NULL;PREQUEST OUTpNextRequest = NULL;LONG Offset; // 磁头偏移;>0: 向内; <0: 向外; =0: 无移动ULONG InsideShortestDistance = 0xFFFFFFFF; // 向内磁头移动最短距离ULONG OutsideShortestDistance = 0xFFFFFFFF; // 向外磁头移动最短距离PREQUEST pNextRequest = NULL;//// 需要遍历请求队列一次或两次//for (pListEntry = RequestListHead.Next; // 请求队列中的第一个请求是链表头指向的下一个请求。
pListEntry != &RequestListHead; // 遍历到请求队列头时结束循环。
pListEntry = pListEntry->Next) {//// 根据链表项获得请求的指针//pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);//// 计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移(方向由正负表示)//Offset = pRequest->Cylinder - CurrentCylinder;if (0 == Offset) {//// 如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。
//pNextRequest = pRequest;goto RETURN;} else if ( Offset > 0 && Offset < InsideShortestDistance ) {//// 记录向内移动距离最短的线程//InsideShortestDistance = Offset;INpNextRequest = pRequest;} else if ( Offset < 0 && -Offset < OutsideShortestDistance ) { //// 记录向外移动距离最短的线程//OutsideShortestDistance = -Offset;OUTpNextRequest = pRequest;}}//判断磁头移动方向,若向内移动if( ScanInside){//判断是否有向内移动的线程if(INpNextRequest){//有则选择该线程return INpNextRequest;} else {//没有则修改磁头方向,选择向外移动距离最短的线程ScanInside = !ScanInside;return OUTpNextRequest;}} else {//如果向外移动//判断是否有向外移动的线程if(OUTpNextRequest){//有则选择该线程return OUTpNextRequest;}else{//没有则修改词头方向,选择向内移动距离最短的线程ScanInside = !ScanInside;return INpNextRequest;}}RETURN:return pNextRequest;}2)编写循环扫描(CSCAN)磁盘调度算法PREQUEST IopDiskSchedule(VOID){PLIST_ENTRY pListEntry;PREQUEST pRequest;PREQUEST INpNextRequest = NULL;PREQUEST OUTpNextRequest = NULL;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0x00000000;PREQUEST pNextRequest = NULL;//// 需要遍历请求队列一次或两次//for (pListEntry = RequestListHead.Next; // 请求队列中的第一个请求是链表头指向的下一个请求。
pListEntry != &RequestListHead; // 遍历到请求队列头时结束循环。
pListEntry = pListEntry->Next) {//// 根据链表项获得请求的指针//pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);//// 计算请求对应的线程所访问的磁道与当前磁头所在磁道的偏移(方向由正负表示)//Offset = pRequest->Cylinder - CurrentCylinder;if (0 == Offset) {//// 如果线程要访问的磁道与当前磁头所在磁道相同,可立即返回。
//pNextRequest = pRequest;goto RETURN;} else if ( Offset > 0 && Offset < InsideShortestDistance ) { //// 记录向内移动距离最短的线程//InsideShortestDistance = Offset;INpNextRequest = pRequest;} else if ( Offset < 0 && -Offset > OutsideShortestDistance ) { //// 记录向外移动距离最长的线程//OutsideShortestDistance = -Offset;OUTpNextRequest = pRequest;}}//需要向内移动的线程是否存在if( INpNextRequest ){//存在则返回向内移动的请求return INpNextRequest;}else{//否则返回向外移动的请求return OUTpNextRequest;}RETURN:return pNextRequest;}3)编写N-Step-SCAN磁盘调度算法//// N-Step-SCAN 磁盘调度算法使用的子队列长度N//#define SUB_QUEUE_LENGTH 6//// 记录N-Step-SCAN 磁盘调度算法第一个子队列剩余的长度。
// 子队列初始长度为N,每执行一次磁盘调度算法会从子队列中移除一个请求,子队列// 长度就要减少1,待长度变为0 时,再将长度重新变为N,开始处理下一个子队列。
//ULONG SubQueueRemainLength = SUB_QUEUE_LENGTH;//// 扫描算法中磁头移动的方向。
操作系统启动时初始化为磁头向内移动。
// TRUE,磁头向内移动,磁道号增加。
// FALSE,磁头向外移动,磁道号减少。
//BOOL ScanInside = TRUE;PREQUEST IopDiskSchedule(VOID){PLIST_ENTRY pListEntry;PREQUEST pRequest;PREQUEST INpNextRequest = NULL;PREQUEST OUTpNextRequest = NULL;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0xFFFFFFFF;PREQUEST pNextRequest = NULL;ULONG counter;//// 需要遍历请求队列一次或两次////计数器记录一个子队列剩余的长度counter = SubQueueRemainLength;//没调度一次子队列剩余的长度减SubQueueRemainLength--;//如果子队列剩余的长度为,则重置为子队列原长度if(SubQueueRemainLength == 0)SubQueueRemainLength = SUB_QUEUE_LENGTH;for (pListEntry = RequestListHead.Next; // 请求队列中的第一个请求是链表头指向的下一个请求。