操作系统——移动臂调度算法的实现
移臂调度算法

移臂调度算法移臂调度算法一、实验目的作为操作系统的辅助存储器,用来存放文件的磁盘是一类高速大容量旋转型存储设备,在繁重的I/O设备负载下,同时会有若干传输请求来到并等待处理,系统必须采用一种调度策略,能够按最佳次序执行要求访问的诸多请求,这叫做驱动调度,所使用的算法叫做驱动调度算法。
驱动调度算法能减少为若干I/O请求服务所需消耗的总时间,从而提高系统效率。
对于磁盘设备,在启动之前按驱动调度策略对访问的请求优化其排序十分必要。
除了使旋转圈数达到最少的调度策略外,还应考虑使移动臂的移动时间最短的调度策略。
二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体会及对实验的改进意见和见解。
三、程序及主要符号说明(1)先来先服务(FCFS)这是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
(2)最短寻道时间优先(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
(3)扫描算法(SCAN)SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
操作系统实验之调度算法

函数从键盘输入读取进程需要运行的时间和初始化队列及进程控制块PCB,调用时间片轮转函数
void SJP_Simulatovoid
SJP_Simulatovoid
SJP_Simulatovoid
SJP_Simulator(Proc r(Proc r(Proc r(Proc &H)&H)&H)&H)
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:
(4) 处理器调度总是选择标志单元指示的进程运行。由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行: 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片 (5) 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间
子函数的说明如下: 初始化就绪队列
void InitPCB(Proc &H) { cout<<"请输入总进程个数: ";
cin>>ProcNum;
int Num=ProcNum;
H=(Proc)malloc(sizeof(PNode));
H->next=NULL;
Proc p=H;
cout<<"总进程个数为 "
操作系统磁头引臂调度算法

操作系统磁头引臂调度算法操作系统的磁头引臂调度算法是磁盘调度算法的一种,用于管理磁盘访问请求的顺序,以提高磁盘I/O系统的性能。
在操作系统中,磁道是磁盘表面上的一个圆环,磁头是读写磁道上数据的设备。
磁头引臂用于支撑磁头,并将磁头移动到不同的磁道上进行读写操作。
磁头引臂调度算法的目标是最小化磁头移动的时间,以减少访问延迟并提高磁盘的吞吐量。
常见的磁头引臂调度算法有以下几种:1.先来先服务算法(FCFS):该算法将磁盘请求按照它们到达磁盘的顺序进行服务。
虽然该算法实现简单,但是可能会导致磁头在不同的磁道上频繁移动,从而降低磁盘I/O系统的性能。
2.最短寻道时间优先算法(SSTF):该算法选择离当前磁头位置最近的磁道进行服务。
这样可以最小化磁头移动的距离,从而提高磁盘I/O系统的性能。
然而,该算法可能会导致一些请求一直等待,从而产生饥饿现象。
3.扫描算法(SCAN):该算法将磁头按照一个方向移动,直到到达最外或最内磁道。
然后,磁头方向改变,并在返回的过程中服务等待的磁道请求。
这样可以通过服务等待请求来减少移动距离。
然而,该算法可能会导致一些请求等待时间较长。
4.循环扫描算法(C-SCAN):该算法类似于扫描算法,但是在磁头到达一端后,直接返回到另一端并重新开始。
这样可以避免一些请求长时间等待。
5.电梯算法(LOOK):该算法类似于扫描算法,但是在磁头到达一端后,不直接返回,而是只服务等待的磁道请求。
这样可以减少磁头移动的距离,并提高磁盘I/O 的吞吐量。
以上是常见的磁头引臂调度算法,它们各有优劣。
在实际应用中,选择合适的磁头引臂调度算法取决于具体的应用场景和需求。
一般来说,SSTF算法和LOOK算法是应用较广泛的磁头引臂调度算法,它们相对简单而且能够提供较好的性能。
值得注意的是,随着技术的发展,新的磁盘调度算法也在不断涌现,例如基于预测磁盘访问模式的算法(如SSF和C-SCAN-EDF算法)以及基于套接字的磁盘调度算法(如HybridSCAN算法)。
第五章_磁盘移臂调度算法

例1:假定某移动磁盘上,处理了访问56号柱面的请 求后,现在正在70号柱面上读信息,目前有下面的请 求访问磁盘柱面的序列: 73, 68, 100, 120, 60, 108, 8, 50 请写出下列各小题的响应的次序及移动的柱面数。 ⑴用最短查找时间优先算法 ⑵电梯调度算法 解: ⑴ 用SSTF,响应的次序为 70、68、73、60、50、8、100、108、120 移动的柱面数:2+5+13+10+42+92+8+12=184 ⑵ 用电梯调度算法,响应的次序为 70、73、100、108、120、68、60、50、8 移动的柱面数:3+27+8+12+52+8+10+42=162
ቤተ መጻሕፍቲ ባይዱ
当前磁道=100
例:假定磁盘共有40个柱面,当前磁头正 在第11道服务,等待服务的进程有6个,它们请 求的柱面分别是:1, 36, 16, 34, 9 和 12 (以请求 时间先后为序)。
按FCFS算法: 移动为:11 1 36 16 34 9 12 总移动柱面数:10+35+20+18+25+3 = 111
5.4.1 磁盘移臂调度
磁盘是对被多个进程共享的设备。当有多个进 程都请求访问磁盘时,应采用一种适当的调度算法, 以使各进程对磁盘的平均访问(主要是寻道)时间 最小。由于在访问磁盘的时间中、主要是寻道时间, 因此,磁盘调度的目标应是使磁盘的平均寻道时间 最少。 常用的磁盘调度算法有: ⑴ 先来先服务; ⑵ 最短寻道时间优先; ⑶ 扫描算法; ⑷ 循环扫描算法 等.
按按此策略完成 这组I/O操作需移动 磁头的总距离为642 磁道。
操作系统-磁盘的驱动调度

0、磁盘的驱动调度有“移臂调度”和“旋转调度”两部分组成。
常用的移臂调度算法有:先来先服务算法最短寻找时间优先算法电梯调度算法单向扫描算法。
(要注意题目要求的是哪种算法,求总移动距离还是平均移动距离)假设柱面的编号从0到199。
例如,如果现在读写磁头正在53号柱面上执行输入输出操作,而等待访问者依次要访问的柱面为98,183,37,122,14,124,65,67。
(1).先来先服务调度算法当53号柱面上的操作结束后,访问柱面的次序为98,183,37,122,14,124,65,67。
读写磁头总共移动了640个柱面的距离。
(从53开始,每次移动距离之和,平均移动距离是640/8=80个柱面)(2).最短寻找时间优先调度算法现在当53号柱面的操作结束后,访问次序为65、67、37、14,98,122,124,183。
读写磁头总共移动了236个柱面的距离。
(从53开始,每次找距离当前最近的进行移动)(3) 电梯调度算法由于该算法是与移动臂的方向有关,所以,应分两种情况来讨论。
(i)移动臂先向外移。
当前正在53号柱面执行操作的读写磁头是移动臂由里向外(向0号柱面方向)带到53号柱面的位置,因此,当访问53号柱面的操作结束后,依次访问的次序为37、14,65,67,98,122,124,183。
读写磁头共移动了208个柱面的距离。
(ii)移动臂先向里移。
当前正在53号柱面执行操作的读写磁头是移动臂由外向里(向柱面号增大方向)带到53号柱面的位置,因此,当访问53号柱面的操作结束后,依次访问的次序为65、67,98,122,124,183、37,14柱面的访问者服务。
读写磁头共移动了299个柱面的距离。
(总之象电梯一样,移动一个来回完成所有访问)(4).单向扫描调度算法方向是从外向里扫描,即从0柱面开始,访问的柱面次序为:65,67,98,122,124,183,14,37 读写磁头一共移动了12+2+31+24+2+59+14+231. 一个磁盘组有100个柱面,每柱面8个磁道,每磁道8个扇区,现有一个文件含5000个记录,每记录与扇区大小相等,在磁盘组上顺序存放(从0面0道0扇区开始),问(1)第3468个记录的物理位置(2)第56个柱面上第7磁道第5扇区对应的块号。
操作系统中的调度算法分析

操作系统中的调度算法分析操作系统是计算机系统中最为重要的组成部分之一,它负责管理计算机系统的资源,包括硬件和软件资源,并且为其它应用程序提供支持和服务。
在操作系统中,调度算法是其中非常重要的一部分,对于它的优化和改进有着非常重要的意义。
本文将按照类别对操作系统中的调度算法进行详细分析,包括批处理系统中的调度算法、交互式系统中的调度算法、实时系统中的调度算法,以及多处理器系统中的调度算法。
一、批处理系统中的调度算法批处理系统是指能够自动地运行一批作业的操作系统,它是在没有任何人的干预下完成作业的自动化系统。
在批处理系统中的调度算法,其主要目的是使各作业的吞吐率最大,并且减少响应时间和等待时间。
在批处理系统中的调度算法包括先来先服务(FCFS)算法、短进程优先(SJF)算法、最高响应比优先(HRRN)算法等。
1、先来先服务(FCFS)算法先来先服务算法,也称为先到先服务算法,是最简单的一种调度算法。
它的作用是按照进程的到达时间的先后顺序进行服务,先到达的进程先得到服务,后到达的进程则必须等待前面进程的服务结束才能够被执行。
优点是公平、简单,缺点是会导致长作业等待时间长,短作业等待时间短。
2、短进程优先(SJF)算法短进程优先算法,是按照进程的执行时间长度来排序,执行时间越短的进程优先得到服务,它可以使得等待时间总和最小,从而提高系统的吞吐率。
但是,如果遇到长作业,则会导致短作业等待时间过长。
3、最高响应比优先(HRRN)算法最高响应比优先算法,则是综合考虑前两种算法的优点而得到的一种调度算法,它会计算出每个进程的响应比,并且选择响应比最高的进程进行执行。
响应比的计算公式是:响应比 = (等待时间 + 执行时间) / 执行时间该算法可以最大限度地减少等待时间,并且适用于长作业与短作业的服务。
二、交互式系统中的调度算法相比于批处理系统,交互式系统强调用户体验,需要快速响应用户的指令请求。
因此,交互式系统中的调度算法,其主要目的是降低响应时间,尽可能快地处理用户的请求。
操作系统调度算法

操作系统调度算法1.先来先服务(FCFS)调度算法:先来先服务调度算法是最简单的调度算法之一、按照任务到达的先后顺序进行调度,先来的任务先得到执行,直到完成或阻塞。
该算法不考虑任务的执行时间,可能导致短任务等待时间过长,产生“饥饿”现象。
2.最短作业优先(SJF)调度算法:最短作业优先调度算法在任务到达时根据任务所需执行时间进行排序,选择执行时间最短的任务。
该算法可以最小化平均等待时间和周转时间,但需要完全了解任务的执行时间,对于无法准确预测执行时间的情况效果较差。
3.优先级调度算法:优先级调度算法为每个任务分配一个优先级,按照优先级从高到低进行调度。
常见的优先级调度算法有静态优先级调度和动态优先级调度。
静态优先级调度在任务到达时即确定优先级,而动态优先级调度可以根据任务的实时状态动态调整优先级。
优先级调度算法需要合理设置优先级,避免产生“饥饿”现象。
4.时间片轮转(RR)调度算法:时间片轮转调度算法将CPU时间划分为一个个固定长度的时间片,任务按照顺序分配时间片,如果任务在一个时间片内无法完成,则将其放入就绪队列的末尾,继续执行下一个任务。
时间片轮转调度算法可以降低响应时间和提高交互性,但对于长时间的任务可能会造成不必要的上下文切换。
5.多级反馈队列调度算法:多级反馈队列调度算法将任务分为多个不同优先级的队列,每个队列按照FCFS或RR算法进行调度。
任务在较高优先级队列等待一定时间后,如果未能完成,则降低优先级,放入更低优先级队列继续执行。
多级反馈队列调度算法可以适应不同任务类型和执行时间。
总结来说,不同的调度算法适用于不同的场景和需求。
先来先服务调度算法简单直观,但可能存在任务等待时间过长的问题;最短作业优先调度算法可以最小化任务的平均等待时间和周转时间,但需要准确预测任务的执行时间;优先级调度算法可以根据任务的重要性进行优先级调度,但需要合理设置优先级;时间片轮转调度算法可以提高交互性,但可能造成不必要的上下文切换;多级反馈队列调度算法可以适应不同任务类型和执行时间,但需要合理设置队列的优先级和时间片长度。
操作系统-调度的实现与方法

2.3.3调度的实现方法一、作业调度功能(一)采用作业控制块(J C B)表格,记录系统中各作业工作状况。
(二)根据选定的调度算法,从后备作业中选出一部分(多道情况)或一个作业投入运行。
(三)为被选中的作业做好运行前的准备,包括选择系统相应的“进程”执行单元以及为这些“进程”分配系统资源,首先判断用户的资源要求是否能够满足。
(四)作业处理后的善后处理工作,例如:回收资源和记帐等工作。
二、调度算法设计的目标(一)系统尽量大的吞吐量。
(二)C P U保持忙。
(三)I/O保持忙。
(四)对所有类型的作业尽量公平。
三、设计调度算法要考虑的主要因素(一)算法应符合系统的总目标。
(二)资源使用均衡,系统效率尽量高。
(三)保证进入系统的作业在规定的时间内完成。
四、常用的作业调度算法(一)先来先服务(f i r s t c o m e f i r s t s e r v e,F C F S)1、作业执行次序与作业进入输入井次序相同。
2、优点(1)实现简单。
(2)对相同的或均衡的作业较为合理。
3、缺点不利于运行时间短的作业。
(二)最短作业优先法(s h o r t e s t j o b f i s t,S J F)1、最短作业优先法也就是选t i值小的优先,也就是只考虑运行时间。
2、优点短作业得到了优先执行,提高了系统的效率。
3、缺点当作业不断进入时,长的作业有可能长时间等待。
(三)最高响应比优先法(h i g h e s t r e s p o n s e-r a t i o n e x t,H R N)1、最高响应比优先法(H R N)是对F C F S方式和S J F方式的一种综合平衡。
H R N调度策略调度时,同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
2、响应比或称响应系数比R定义如下:R=(W+T)/T=1+W/T其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京工程学院
上机实验报告
课程名称:操作系统
实验项目名称:移动臂调度算法的实现学生班级:
学生学号:
学生姓名:
指导教师:
实验时间:
实验地点:信息楼专业机房实验成绩评定:
2016-2017-1学期
一、实验目的及内容
掌握操作系统的设备管理功能,熟悉移动臂调度算法,设计恰当的数据结构和算法,模拟实现移动臂调度算法。
要求至少模拟实现一种磁盘移臂调度算法。
二、实验相关知识简介
磁盘移臂调度的目标就是要使磁盘访问的总时间中的寻找时间最小。
因此,磁盘移臂调度要尽量减少磁盘移动臂移动的距离。
磁盘移臂调度算法很多,常用的也有好几种,一个好的磁盘调度算法,不仅要使磁盘寻找时间最小,同时,还要避免移动臂频繁地改变移动方向,因为频繁的改向不仅使时间增加,还容易损耗机械部件。
常用的磁盘移臂调度算法有:先来先服务、最短寻找时间优先、单向扫描、双向扫描调度算法等。
三、解决问题思路及关键程序代码分析
(一) 最短寻找时间优先调度算法简介
最短寻找时间调度算法总是使寻找时间最短的请求最先得到服务,跟请求者的请求时间先后顺序无关。
这种算法具有比先来先服务更好的性能。
但是该算法可能会出现请求者被“饿死”的情况,当靠近磁头的请求源源不断地到来,这会使早来的但离磁头较远的请求长时间得不到服务。
该算法的优点是可以得到较短的平均响应时间,有较好的吞吐量。
该算法的缺点是缺乏公平性,对中间磁道的访问比较“照顾”,对两端磁道访问比较“疏远”,相应时间的变化幅度较大。
该算法与先来先服务算法一样,都会导致移动臂频繁改向。
(二) 算法模拟
1. 对算法设计进行说明
该算法的实现中,主要是选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻道时间最短。
当选择了某个离当前磁头所在磁道最近的磁道,下一轮的当前磁道便改成了上一轮的最近磁道,并且把这个最近的磁道从请求序列取消,直到请求序列中不再有请求的磁道。
2. 关键代码分析
import java.io.*;
import java.util.*;
public class
{
private static int maxsize = 100;
private static int Disc[] = new int[maxsize]; //请求序列
private static int count;//要访问的磁道数
private static int disc; //当前磁道号
private static int perTime;//移过每个柱面需要时间
private static int Distance=0;//总寻道长度
private static int FindTime;//查找时间
private static double AvgDistance;//平均寻道长度
public Suanfa(int disc,int count,int perTime,int Disc[])
{
this.disc=disc;
this.count=count;
this.perTime=perTime;
for(int i=0;i<Disc.length;i++)
Disc[i]=Disc[i];
}
public void input()
{
System.out.print("请输入当前磁道号:");
Scanner s1=new Scanner(System.in);
disc=s1.nextInt();
System.out.print("请输入要访问的磁道数:");
Scanner s2=new Scanner(System.in);
count=s2.nextInt();
System.out.print("请输入移过每个柱面需要的时间:");
Scanner s3=new Scanner(System.in);
perTime=s3.nextInt();
System.out.print("请输入磁盘请求序列(以空格隔开):");
Scanner s4=new Scanner(System.in);
for(int i=0;i<count;i++)
Disc[i]=s4.nextInt();
}
public void Delete(int arr[],int n)
{
for(int i=n;i<arr.length-1;i++)
arr[i]=arr[i+1];
}
public void running()
{
int j=0,count1=count;
int min;
int discc=disc;
int Discc[]=new int[count];
while(j<count)
{
int num=0;
min=(Disc[0]>=discc)?(Disc[0]-discc):(discc-Disc[0]);
for(int i=0;i<count1;i++)
{
if(((Disc[i]>=discc)&&(Disc[i]-discc<min))||((Disc[i]<discc)&&(discc-Disc[i
]<min)))
{
min=(Disc[i]>=discc)?(Disc[i]-discc):(discc-Disc[i]);
num=i;
}
}
Discc[j++]=Disc[num];
Distance+=min;
discc=Disc[num];
Delete(Disc,num);
count1--;
}
AvgDistance=(double)Distance/count;
FindTime=perTime*Distance;
System.out.print("\n服务序列:"+disc+" ");
for(int i=0;i<count;i++)
System.out.print(Discc[i]+" ");
System.out.println("\n总寻道长度:"+Distance);
System.out.println("平均寻道长度:"+AvgDistance);
System.out.println("寻道时间:"+FindTime+"ms");
}
public static void main(String[] args)
{
System.out.println("----------最短寻找时间优先算法----------");
Suanfa Suanfa=new Suanfa(disc,count,perTime,Disc);
Suanfa.input();
Suanfa.running();
}
}
四、运行结果
程序的运行结果如图所示:
五、体会与提高
通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力。
虽然在分析问题的过程中,遇到了很多的疑惑与不解,但同时掌握了很多进程同步的知识
教师评语:。