操作系统的调度算法—进程调度算法、页面置换算法、动态分区算法、磁盘调度算法(常问面试题)
作者:互联网
8、调度算法
8.1、进程调度算法
1、先来先服务FCFS
非抢占式调度算法,按照请求的顺序进行调度。有利于长作业,不利于短作业,短作业必须等长作业执行完毕才执行,长作业耗时又很长,这样会导致短作业等待时间过长。
2、短作业优先SJF
非抢占式调度算法,按预估运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态,要是一直一直有短作业来,长作业永远得不到调度。
3、最短剩余时间优先SRTN
最短作业优先的抢占式版本,按照剩余运行时间的顺序进行调度,一个新作业到大,整个运行时间与当前进程的剩余时间做比较。要是新的进程需要时间更少,就挂起当前的进程,运行新的进程。
4、时间片轮转
将所有就绪进程按照FCFS的原则排成一个队列,每次调度,把CPU的时间分给队首进程,该进程可以执行一个时间片。时间片用完了,计时器会发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,然后继续把CPU时间分配给队首进程。所以其实这个算法的效率跟时间片的大小有很大的关系:
- 因为进程切换都要保存进程的信息并载入新进程的信息,要是时间片太小,会导致进程切换的太频繁,在进程切换上会花过多的时间;
- 时间片过长,那实时性就不能保证。
5、优先级调度
为每个进程分配一个优先级,按优先级进行调度。为了防止优先级低的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
6、多级反馈队列
一个进程需要执行100个时间片,要是采用时间片轮转调度算法,就需要交换100次。那多级队列是为这种需要连续执行多个时间片的进程考虑,会设置时间片大小不用的队列(比如:1,2,4,8,32),进程在第一个队列没有执行完,就会被移到下一个队列,这样一来需要执行100个时间片的进程,只需要交换7次了。同时,每个队列优先级也不同,最上面的优先级最高,所以只有上一个队列没有进程在排队,才能调度当前队列上的进程。所以可以把多级反馈队列这种算法,看作是时间片轮转调度和优先级调度算法的结合版。
8.2、页面置换算法
1、最佳置换算法OPT
最佳置换算法(OPT,Optimal) :每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。
2、先进先出置换算法FIFO
先进先出置换算法(FIFO) :每次选择淘汰的页面是最早进入内存的页面
- 实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面队列的最大长度取决于系统为进程分配了多少个内存块。
- FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。所谓Belady现象是指:采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
3、最近最久未使用置换算法LRU
最近最久未使用置换算法(LRU,least recently used) :每次淘汰的页面是最近最久未使用的页面。
- 实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自.上次被访问以来所经历的时间t(该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大)。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
- LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类算法,理论上可以证明,堆栈类算法不可能出现Belady异常。
4、时钟置换算法CLOCK
最佳置换算法性OPT能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体,因为算法要循环扫描缓冲区像时钟一样转动。所以叫clock算法。
时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,Not Recently Used)。简单的CLOCK算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰-一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第- - ~轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择–个淘汰页面最多会经过两轮扫描) 。
5、改进型的时钟置换算法
简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1, 1)表示一个页面近期被访问过,且被修改过。
改进型的Clock算法需要综合考虑某一内存页面的访问位和修改位来判断是否置换该页面。在实际编写算法过程中,同样可以用一个等长的整型数组来标识每个内存块的修改状态。访问位A和修改位M可以组成一下四种类型的页面。
6、总结
算法 | 规则 | 优缺点 |
---|---|---|
OPT | 优先淘汰最长时间内不会被访问的页面 | 缺页率最小,性能最好,但无法实现 |
FIFO | 优先淘汰最先进入内存的页面 | 实现简单,但性能很差,可能出现Belady异常 |
LRU | 优先淘汰最近最久没访问的页面 | 性能很好,但需要硬件支持,算法开销大 |
CLOCK | 循环扫描各页面,第一轮淘汰访问位=0,并将扫描过的页面访问位改为1.若第一轮没选中,则进行第二轮扫描 | 实现简单,算法开销小,但未考虑页面是否被修改过 |
改进型CLOCK | 若用(访问位,修改位)的形式表述,则 第一轮:淘汰(0,0) 第二轮:淘汰(O,1),并将扫描过的页面访问位都置为0 第三轮:淘汰(O,0),第四轮淘汰(0,1) | 算法开销小,性能较稳定 |
8.3、动态分区算法
1、首次适应算法
- 算法思想:每次都从低地址开始查找,找到第–个能满足大小的空闲分区。
- 如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链( 或空闲分[表),找到大小能满足要求的第-一个空闲分区。
2、最佳适应算法
- 算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
- 如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。
3、最坏适应算法
- 又称最大适应算法(Largest Fit)
- 算法思想:为了解决最佳适应算法的问题—即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
- 如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。
4、邻近适应算法
- 算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
- 如何实现:空闲分区以地址递增的顺序排列(可排成-一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
5、总结
8.4、磁盘调度算法
读写一个磁盘块的时间的影响因素有:
-
旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
-
寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
-
实际的数据传输时间
其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。
1、先来先服务
按照磁盘请求的顺序进行调度。
优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。
2、最短寻道时间优先
优先调度与当前磁头所在磁道距离最近的磁道。
虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两端的磁道请求更容易出现饥饿现象。
3、电梯扫描算法
电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。
电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。
标签:面试题,调度,访问,算法,进程,空闲,页面 来源: https://blog.csdn.net/loytuls/article/details/123425776