休电梯算法
Ⅰ 电梯调度算法
(1)电梯调度算法的处理次序为:
5
8
1
4
3
6
2
7
(2)最短寻找时间优先算法的处理次序为:
5
8
6
2
7
1
4
3
Ⅱ 五分钟聊完磁盘
盘可以说是硬件里面比较简单的构造了,同时也是最重要的。下面我们从盘谈起,聊聊它的物理构造
盘会有很多种类型。其中最简单的构造就是 磁盘(magnetic hard disks) , 也被称为 hard disk,HDD 等。磁盘通常与安装在磁臂上的磁头配对,磁头可将数据读取或者将数据写入磁盘,因此磁盘的读写速度都同样快。在磁盘中,数据是随机访问的,这也就说明可以通过任意的顺序来 存储 和 检索 单个数据块,所以你可以在任意位置放置磁盘来让磁头读取,磁盘是一种 非易失性 的设备,即使断电也能永久保留。
在计算机发展早期一般是用光盘来存储数据的,然而随着固态硬盘的流行,固态硬盘不包含运动部件的特点,成为现在计算机的首选存储方式。
为了组织和检索数据,会将磁盘组织成特定的结构,这些特定的结构就是 磁道、扇区和柱面
每一个磁盘都是由无数个同心圆组成,这些同心圆就好像树的年轮一样
磁盘被组织成柱面形式,每个盘用轴相连,每一个柱面包含若干磁道,每个磁道由若干扇区组成。软盘上大约每个磁道有 8 - 32 个扇区,硬盘上每条磁道上扇区的数量可达几百个,磁头大约是 1 - 16 个。
对于磁盘驱动程序来说,一个非常重要的特性就是控制器是否能够同时控制两个或者多个驱动器进行磁道寻址,这就是 重叠寻道(overlapped seek) 。对于控制器来说,它能够控制一个磁盘驱动程序完成寻道操作,同时让其他驱动程序等待寻道结束。控制器也可以在一个驱动程序上进行读写操作,与此同时让另外的驱动器进行寻道操作,但是软盘控制器不能在两个驱动器上进行读写操作。
RAID 称为 磁盘冗余阵列 ,简称 磁盘阵列 。利用虚拟化技术把多个硬盘结合在一起,成为一个或多个磁盘阵列组,目的是提升性能或数据冗余。
RAID 有不同的级别
磁盘由一堆铝的、合金或玻璃的盘片组成,磁盘刚被创建出来后,没有任何信息。磁盘在使用前必须经过 低级格式化(low-levvel format) ,下面是一个扇区的格式
前导码相当于是标示扇区的开始位置,通常以位模式开始,前导码还包括 柱面号 、 扇区号 等一些其他信息。紧随前导码后面的是数据区,数据部分的大小由低级格式化程序来确定。大部分磁盘使用 512 字节的扇区。数据区后面是 ECC,ECC 的全称是 error correction code , 数据纠错码 ,它与普通的错误检测不同,ECC 还可以用于恢复读错误。ECC 阶段的大小由不同的磁盘制造商实现。ECC 大小的设计标准取决于 设计者愿意牺牲多少磁盘空间来提高可靠性 ,以及程序可以处理的 ECC 的复杂程度。通常情况下 ECC 是 16 位,除此之外,硬盘一般具有一定数量的备用扇区,用于替换制造缺陷的扇区。
低级格式化后的每个 0 扇区的位置都和前一个磁道存在 偏移 ,如下图所示
这种方式又被称为 柱面斜进(cylinder skew) ,之所以采用这种方式是为了提高程序的运行性能。可以这样想,磁盘在转动的过程中会经由磁头来读取扇区信息,在读取内侧一圈扇区数据后,磁头会进行向外侧磁道的寻址操作,寻址操作的同时磁盘在继续转动,如果不采用这种方式,可能刚好磁头寻址到外侧,0 号扇区已经转过了磁头,所以需要旋转一圈才能等到它继续读取,通过柱面斜进的方式可以消除这一问题。
柱面斜进量取决于驱动器的几何规格。柱面斜进量就是两个相邻同心圆 0 号扇区的差异量。如下图所示
这里需要注意一点,不只有柱面存在斜进,磁头也会存在 斜进(head skew) ,但是磁头斜进比较小。
磁盘格式化会减少磁盘容量,减少的磁盘容量都会由前导码、扇区间间隙和 ECC 的大小以及保留的备用扇区数量。
在磁盘使用前,还需要经过最后一道工序,那就是对每个分区分别执行一次 高级格式化(high-level format) ,这一操作要设置一个引导块、空闲存储管理(采用位图或者是空闲列表)、根目录和空文件系统。这一步操作会把码放在分区表项中,告诉分区使用的是哪种文件系统,因为许多操作系统支持多个兼容的文件系统。在这一步之后,系统就可以进行引导过程。
下面我们来探讨一下关于影响磁盘读写的算法,一般情况下,影响磁盘快读写的时间由下面几个因素决定
这三种时间参数也是磁盘寻道的过程。一般情况下,寻道时间对总时间的影响最大,所以,有效的降低寻道时间能够提高磁盘的读取速度。
如果磁盘驱动程序每次接收一个请求并按照接收顺序完成请求,这种处理方式也就是 先来先服务(First-Come, First-served, FCFS) ,这种方式很难优化寻道时间。因为每次都会按照顺序处理,不管顺序如何,有可能这次读完后需要等待一个磁盘旋转一周才能继续读取,而其他柱面能够马上进行读取,这种情况下每次请求也会排队。
通常情况下,磁盘在进行寻道时,其他进程会产生其他的磁盘请求。磁盘驱动程序会维护一张表,表中会记录着柱面号当作索引,每个柱面未完成的请求会形成链表,链表头存放在表的相应表项中。
一种对先来先服务的算法改良的方案是使用 最短路径优先(SSF) 算法,下面描述了这个算法。
假如我们在对磁道 6 号进行寻址时,同时发生了对 11 , 2 , 4, 14, 8, 15, 3 的请求,如果采用先来先服务的原则,如下图所示
我们可以计算一下磁盘臂所跨越的磁盘数量为 5 + 9 + 2 + 10 + 6 + 7 + 12 = 51,相当于是跨越了 51 次盘面,如果使用最短路径优先,我们来计算一下跨越的盘面
跨越的磁盘数量为 4 + 1 + 1 + 4 + 3 + 3 + 1 = 17 ,相比 51 足足省了两倍的时间。
但是,最短路径优先的算法也不是完美无缺的,这种算法照样存在问题,那就是 优先级 问题,
这里有一个原型可以参考就是我们日常生活中的电梯,电梯使用一种 电梯算法(elevator algorithm) 来进行调度,从而满足协调效率和公平性这两个相互冲突的目标。电梯一般会保持向一个方向移动,直到在那个方向上没有请求为止,然后改变方向。
电梯算法需要维护一个 二进制位 ,也就是当前的方向位: UP(向上) 或者是 DOWN(向下) 。当一个请求处理完成后,磁盘或电梯的驱动程序会检查该位,如果此位是 UP 位,磁盘臂或者电梯仓移到下一个更高级未完成的请求。如果高位没有未完成的请求,则取相反方向。当方向位是 DOWN 时,同时存在一个低位的请求,磁盘臂会转向该点。如果不存在的话,那么它只是停止并等待。
我们举个例子来描述一下电梯算法,比如各个柱面得到服务的顺序是 4,7,10,14,9,6,3,1 ,那么它的流程图如下
所以电梯算法需要跨越的盘面数量是 3 + 3 + 4 + 5 + 3 + 3 + 1 = 22
电梯算法通常情况下不如 SSF 算法。
一些磁盘控制器为软件提供了一种检查磁头下方当前扇区号的方法,使用这样的控制器,能够进行另一种优化。如果对一个相同的柱面有两个或者多个请求正等待处理,驱动程序可以发出请求读写下一次要通过磁头的扇区。
对于磁盘来说,最影响性能的就是寻道时间和旋转延迟,所以一次只读取一个或两个扇区的效率是非常低的。出于这个原因,许多磁盘控制器总是读出多个扇区并进行高速缓存,即使只请求一个扇区时也是这样。一般情况下读取一个扇区的同时会读取该扇区所在的磁道或者是所有剩余的扇区被读出,读出扇区的数量取决于控制器的高速缓存中有多少可用的空间。
磁盘控制器的高速缓存和操作系统的高速缓存有一些不同,磁盘控制器的高速缓存用于缓存没有实际被请求的块,而操作系统维护的高速缓存由显示地读出的块组成,并且操作系统会认为这些块在近期仍然会频繁使用。
当同一个控制器上有多个驱动器时,操作系统应该为每个驱动器都单独的维护一个未完成的请求表。一旦有某个驱动器闲置时,就应该发出一个寻道请求来将磁盘臂移到下一个被请求的柱面。如果下一个寻道请求到来时恰好没有磁盘臂处于正确的位置,那么驱动程序会在刚刚完成传输的驱动器上发出一个新的寻道命令并等待,等待下一次中断到来时检查哪个驱动器处于闲置状态。
磁盘在制造的过程中可能会有瑕疵,如果瑕疵比较小,比如只有几位,那么使用坏扇区并且每次只是让 ECC 纠正错误是可行的,如果瑕疵较大,那么错误就不可能被掩盖。
一般坏块有两种处理办法,一种是在控制器中进行处理;一种是在操作系统层面进行处理。
这两种方法经常替换使用,比如一个具有 30 个数据扇区和两个备用扇区的磁盘,其中扇区 4 是有瑕疵的。
控制器能做的事情就是将备用扇区之一重新映射。
还有一种处理方式是将所有的扇区都向上移动一个扇区
上面这这两种情况下控制器都必须知道哪个扇区,可以通过内部的表来跟踪这一信息,或者通过重写前导码来给出重新映射的扇区号。如果是重写前导码,那么涉及移动的方式必须重写后面所有的前导码,但是最终会提供良好的性能。
磁盘经常会出现错误,导致好的扇区会变成坏扇区,驱动程序也有可能挂掉。RAID 可以对扇区出错或者是驱动器崩溃提出保护,然而 RAID 却不能对坏数据中的写错误提供保护,也不能对写操作期间的崩溃提供保护,这样就会破坏原始数据。
我们期望磁盘能够准确无误的工作,但是事实情况是不可能的,但是我们能够知道的是,一个磁盘子系统具有如下特性:当一个写命令发给它时,磁盘要么正确地写数据,要么什么也不做,让现有的数据完整无误的保留。这样的系统称为 稳定存储器(stable storage) 。稳定存储器的目标就是不惜一切代价保证磁盘的一致性。
稳定存储器使用两个一对相同的磁盘,对应的块一同工作形成一个无差别的块。稳定存储器为了实现这个目的,定义了下面三种操作:
稳定写指的就是首先将块写到比如驱动器 1 上,然后将其读回来验证写入的是否正确,如果不正确,那么就会再次尝试写入和读取,一直到能够验证写入正确为止。如果块都写完了也没有验证正确,就会换块继续写入和读取,直到正确为止。无论尝试使用多少个备用块,都是在对你驱动器 1 写入成功之后,才会对驱动器 2 进行写入和读取。这样我们相当于是对两个驱动器进行写入。
稳定读指的就是首先从驱动器 1 上进行读取,如果读取操作会产生错误的 ECC,则再次尝试读取,如果所有的读取操作都会给出错误的 ECC,那么会从驱动器 2 上进行读取。这样我们相当于是对两个驱动器进行读取。
崩溃恢复指的是崩溃之后,恢复程序扫描两个磁盘,比较对应的块。如果一对块都是好的并且是相同的,就不会触发任何机制;如果其中一个块触发了 ECC 错误,这时候就需要使用好块来覆盖坏块。
如果 CPU 没有崩溃的话,那么这种方式是可行的。如果在稳定写期间出现 CPU 崩溃会怎么样?这就取决于崩溃发生的精确时间,有五种情况,下面来说一下
这种模式下进行任何优化和改进都是可行的,但是代价高昂,一种改进是在稳定写期间监控被写入的块,这样在崩溃后进行检验的块只有一个。
有一种 非易失性 RAM 能够在崩溃之后保留数据,但是这种方式并不推荐使用。
Ⅲ 电梯算法是怎样的
电梯算法是通过操作系统学术名为SCAN算法。磁臂仅移动到请求的最外道就回转。反方向查找服务。
如果请求调度的磁道为98, 183, 37, 122, 14, 124, 65, 67,磁头从53号磁道开始移动,磁头就会按照65, 67, 98, 122, 124, 183, 37,14 的顺序依次查找,并将数据输入内存。
电梯(升降盒)上下来回地运动,电梯内部有一些按钮,每一个按钮代表一层楼,当按下按钮时,按钮的灯亮。
电梯沿某一方向运动,在将要到达某一层楼时,实时监控器 判断电梯内是否有乘客要在此层楼下电梯,若有,则发送信号给电梯升降架。
电梯是指服务于建筑物内若干特定的楼层,其轿厢运行在至少两列垂直于水平面或与铅垂线倾斜角小于15°的刚性轨道运动的永久运输设备。
也有台阶式,踏步板装在履带上连续运行,俗称自动扶梯或自动人行道。服务于规定楼层的固定式升降设备。垂直升降电梯具有一个轿厢,运行在至少两列垂直的或倾斜角小于15°的刚性导轨之间。
轿厢尺寸与结构形式便于乘客出入或装卸货物。习惯上不论其驱动方式如何,将电梯作为建筑物内垂直交通运输工具的总称。
Ⅳ 求关于 多部电梯调度算法研究
这里是我 一些 想法 LZ可以看看 在这里 主要告诉你的是 C程序设计里面很重要的一个思想那就是 增量开发
首先设计 一个MAIN函数 确定要调用的函数 在函数里面 尽量使用指针变量,这是第一块
第二快: 电梯的初始化
第三快: RUNNING电梯的运行
第四快: 电梯的移动
第五快: 上和下
第六快: 用户的要求 也就是说 电梯到底是上 还是下的设计
第七快 延迟程序 也就说 等待的时间
第八块:STOP
按照这个思路的话,代码加起来有100多行的样子吧
还有就是 LZ在采用这个思路的时候 一定要对函数的运用 很上手啊
要不在调试的时候很容易出BUG的!
希望能帮到你!
Ⅳ 电梯调度算法...
不管你是在北上广还是在港澳台,甚至三四线城市,凡是有规模的地区,高楼比比皆是。不管是写字楼,还是大型商城,让你最头痛的就是乘电梯,尤其是在赶时间的时候。
每天早上,那些差5分钟就迟到的程序员,在等电梯时,一般会做两件事:
前者可能是写字楼里上班族惯有的精神类疾病,但后者肯定是程序员的职业病。本文对“骂电梯”不给予任何指导性建议。
但说起电梯调度算法,我觉得还是可以给大家科普一下,好为大家在等电梯之余,打发时间而做出一点贡献。
(电梯调度算法可以参考各种硬盘换道算法,下面内容整理自网络)
先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。
它根据乘客请求乘坐电梯的先后次序进行调度。此算法的 优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期得不到满足的情况 。
这种方法在载荷较轻松的环境下,性能尚可接受,但是在载荷较大的情况下,这种算法的性能就会严重下降,甚至恶化。
人们之所以研究这种在载荷较大的情况下几乎不可用的算法,有两个原因:
最短寻找楼层时间优先(SSTF-Shortest Seek Time First)算法,它注重电梯寻找楼层的优化。最短寻找楼层时间优先算法选择下一个服务对象的原则是 最短寻找楼层的时间。
这样请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。
在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大 ,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“ 饿死”现象 。
扫描算法(SCAN) 是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。
它进行寻找楼层的优化,效率比较高,但它是一个 非实时算法 。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的。
所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成, 免去了电梯频繁的来回移动 。
扫描算法的平均响应时间比最短寻找楼层时间优先算法长,但是响应时间方差比最短寻找楼层时间优先算法小, 从统计学角度来讲,扫描算法要比最短寻找楼层时间优先算法稳定 。
LOOK 算法是扫描算法(SCAN)的一种改进。对LOOK算法而言,电梯同样在最底层和最顶层之间运行。
但 当 LOOK 算法发现电梯所移动的方向上不再有请求时立即改变运行方向 ,而扫描算法则需要移动到最底层或者最顶层时才改变运行方向。
SATF(Shortest Access Time First)算法与 SSTF 算法的思想类似,唯一的区别就是 SATF 算法将 SSTF 算法中的寻找楼层时间改成了访问时间。
这是因为电梯技术发展到今天,寻找楼层的时间已经有了很大地改进, 但是电梯的运行当中等待乘客上梯时间却不是人为可以控制 。
SATF 算法考虑到了电梯运行过程中乘客上梯时间的影响 。
最早截止期优先(EDF-Earliest Deadline First)调度算法是最简单的实时电梯调度算法,它的 缺点就是造成电梯任意地寻找楼层,导致极低的电梯吞吐率。
它与 FCFS 调度算法类似,EDF 算法是电梯实时调度算法中最简单的调度算法。 它响应请求队列中时限最早的请求,是其它实时电梯调度算法性能衡量的基准和特例。
SCAN-EDF 算法是 SCAN 算法和 EDF 算法相结合的产物。SCAN-EDF 算法先按照 EDF 算法选择请求列队中哪一个是下一个服务对象,而对于具有相同时限的请求,则按照 SCAN 算法服务每一个请求。它的效率取决于有相同 deadline 的数目,因而效率是有限的。
PI(Priority Inversion)算法将请求队列中的请求分成两个优先级,它首先保证高优先级队列中的请求得到及时响应,再搞优先级队列为空的情况下在相应地优先级队列中的请求。
FD-SCAN(Feasible Deadline SCAN)算法首先从请求队列中找出时限最早、从当前位置开始移动又可以买足其时限要求的请求,作为下一次 SCAN 的方向。
并在电梯所在楼层向该请求信号运行的过程中响应处在与电梯运行方向相同且电梯可以经过的请求信号。
这种算法忽略了用 SCAN 算法相应其它请求的开销,因此并不能确保服务对象时限最终得到满足。
以上两结介绍了几种简单的电梯调度算法。
但是并不是说目前电梯调度只发展到这个层次。目前电梯的控制技术已经进入了电梯群控的时代。
随着微机在电梯系统中的应用和人工智能技术的发展,智能群控技术得以迅速发展起来。
由此,电梯的群控方面陆续发展出了一批新方法,包括:基于专家系统的电梯群控方法、基于模糊逻辑的电梯群控方法、基于遗产算法的电梯群控方法、基于胜景网络的电梯群控方法和基于模糊神经网络的电梯群控方法。
本人设置的电梯的初始状态,是对住宅楼的电梯的设置。
(1)建筑共有21层,其中含有地下一层(地下一层为停车场)。
(2)建筑内部设有两部电梯,编号分别为A梯、B梯。
(3)电梯内部有23个按钮,其中包括开门按钮、关门按钮和楼层按钮,编号为-1,1,2,3,4……20。
(4)电梯外部含有两个按钮,即向上运行按钮和向下运行按钮。建筑顶层与地下一层例外,建筑顶层只设置有向下运行按钮,地下一层只设置有向上运行按钮。
(5)电梯开关门完成时间设定为1秒。电梯到达每层后上下人的时间设定为8秒。电梯从静止开始运行到下一层的时间设置为2秒,而运行中通过一层的时间为1秒。
(6)在凌晨2:00——4:30之间,如若没有请求信号,A梯自动停在14层,B梯自动停在6层。
(7)当电梯下到-1层后,如果没有请求信号,电梯自动回到1层。
每一架电梯都有一个编号,以方便监控与维修。每一架电梯都有一实时监控器,负责监控电梯上下,向电梯升降盒发送启动、制动、加速、减速、开关电梯门的信号。若电梯发生故障,还应向相应的电梯负责人发送求救信号。
电梯内部的楼层按钮:
这样就表示乘客将要去往此层,电梯将开往相应层。当电梯到达该层后,按钮恢复可以使用状态。
电梯内部开门按钮:
如若电梯到了乘客曾经按下的楼层,但是无乘客按开门按钮,电梯将自动在停稳后1秒后自动开门。
电梯内部关门按钮:
电梯外部向上按钮:
电梯外部向下按钮:
你肯能意识到 哪个算法都不是一个最佳方案,只是它确实解决了一定情况的问题 。但是对一个优秀的程序员而言,研究各种算法是无比快乐的。也许你下一次面试,就有关于调度算法的问题。
Ⅵ 帕累托原则是什么麦肯锡30秒电梯理论,莫法特休息法则是什么
帕累托法则也叫20/80法则:在因和果,努力和收获之间普遍存在着不平衡关系,典型的情况是,80%的收获来自20%的努力,其他80%的气力只产生20%的结果。
Ⅶ 操作系统模拟电梯调度算法C语言程序
多级反馈队列调度算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法。 多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最高的队列)的时间片一般很大(不需要考虑这个问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。 2、时刻1 J2到达。 由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。 5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。 6、时刻5 J3经过1个时间片,完成。 7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 8、时刻7 J1再经过一个时间片,完成了任务。于是整个调度过程结束。
Ⅷ 操作系统磁盘调度的电梯算法是怎么回事阿思想是什么比如磁道号从41开始,磁盘请求序列为:20
就是读取时按找当前的移动方向读取下一个,到顶后再反着读,就跟坐电梯一样,要不先上,要不先下。
下:41 20 12 4 上: 44 76 80
合起来就是: 41 20 12 4 44 76 80
这样的话磁头的总移动距离会相对减少
Ⅸ 电梯调度算法
(1)电梯调度算法的处理次序为:
58143627
(2)最短寻找时间优先算法的处理次序为:
58627143
Ⅹ 如何将各种算法应用到实际的电梯调度中
说明 假设大厦有31层楼.电梯每经过1层(不论上下行)的时间是4秒.也就是说,电梯从1楼到31楼且中间不停则需要(31-1)*4=120秒.电梯每次需要停10秒,因此,如果电梯每层都停一次,就需要30*4+29*10=410秒.与此同时,员工步行一层楼(不论上下行)需要20秒,从1楼到31楼就需要30*20=600秒.明显,这个主意不好.因此,很多员工依赖电梯前往他们的办公室.现在我们需要设计一个方案,这个方案的设计目标是让最后一个到达办公室的员工花费最短的时间(也就是说,他并不保证每一位员工都能最快到达自己办公室).比如,如果员工想到达4,5和10层,则电梯的运行方案是在4和10层停止.因为电梯在第12秒到达4层,停止10秒,则电梯到达10层需要3*4+10+6*4=46秒.按此计划,住在4层的员工需要12秒,5层的员工需要12+20=32秒,10层的员工需要46秒.因此,最后到达办公室的员工需要46秒.对于大家来说,这是个不错的方案.
实现 下面就详细说一说我实现的具体方式,虽然花了我近2天的时间,但是其实并不是很复杂,这里我本着抛砖引玉的原则,下面就一起来看看吧:
我们将定义一个名叫Case的class用来存储一些要测试的数据,然后再定义一个叫CaseUtil的class用来实现我们的方案。
首先我说一下具体得思路:这里我只考虑从下到上的方案(从上到下其实是一样的,具体自己想吧)。举个例子,假设当前的楼层是【29 30 31】.3个。那么我们该如何做呢?
首先,不管怎么说,假设最后一层即31的到达时间为 (31-1)* 4 + (stopNums-1)*10 说明一下,这里为了简单起见我们就按照案例的数据进行分析,实际上4表示电梯经过每层所需时间,而10表示电梯每层停靠的时间。上面的stopNums是什么呢?就是电梯到达31层时所有的停靠次数,减去1是除去31层得停靠。而最后一层到达的人则很可能为最后一位到达的人,为什么不是一定呢,按照本例,上面举得例子就可以很简单的看出,在28、31停2次即可,此时最后一个到达的就是地30层的人了。当然在仅仅是在本例中,实际上会由于具体数值不一样而有不同。所以这里我用了可能,而它也和我们的最优解很接近了,而这给了我想法。虽然最后一层不一定是最后一位,但已经很接近了,而它所花费的时间,仅仅只和一个变量有关,即stopNums,即可以得出如下结论:
电梯的停靠次数越少,最后一层的时间也就越少,同样最佳时间也就越少。
假设我们有一个方法可以根据当前的停靠次数来计算最佳的停靠方案,那么我们该如何得到实际最佳方案呢?下面的一段代码很好的可以达到我们的目标。