操作系统浓缩笔记(6)-调度算法

 文章笔记主要引用:

阿秀的学习笔记 (interviewguide.cn)

小林coding (xiaolincoding.com)

【操作系统】2.4进程管理(调度算法)_进程等待时间_coolcoo1cool的博客-CSDN博客

进程调度算法你了解多少?

1、 先来先服务 first-come first-serverd(FCFS)

非抢占式的调度算法,按照请求的顺序进行调度。

有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

2、 短作业优先 shortest job first(SJF)

非抢占式的调度算法,按估计运行时间最短的顺序进行调度。

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

3、最短剩余时间优先 shortest remaining time next(SRTN)

最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。

如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

4、时间片轮转

将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。

当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

  • 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
  • 而如果时间片过长,那么实时性就不能得到保证。

5、优先级调度

为每个进程分配一个优先级,按优先级进行调度。

为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

6、多级反馈队列

一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,进程在第一个队列没执行完,就会被移到下一个队列。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

7、高响应比优先调度算法

主要是权衡了短作业和长作业。

每次进行进程调度时,先计算「响应比优先级」,然后把「响应比优先级」最高的进程投入运行,「响应比优先级」的计算公式:

从上面的公式,可以发现:

  • 如果两个进程的「等待时间」相同时,「要求的服务时间」越短,「响应比」就越高,这样短作业的进程容易被选中运行;
  • 如果两个进程「要求的服务时间」相同时,「等待时间」越长,「响应比」就越高,这就兼顾到了长作业进程,因为进程的响应比可以随时间等待的增加而提高,当其等待时间足够长时,其响应比便可以升到很高,从而获得运行的机会;

进程调度中的各种指标:

CPU利用率

  • CPU利用率:指CPU忙碌的时间占总时间的比例
  • 利用率 = 忙碌的时间 / 总时间

系统吞吐量

  • 系统吞吐量:单位时间内完成的作业的数量
  • 系统吞吐量 = 总共完成了多少道作业 / 总共花了多少时间

周转时间

  • 周转时间:从用户作业提交到系统开始,到作业执行完成为止这段时间间隔
    • 作业在外存后备队列上的等在作业调度的时间
    • 进程在就绪队列上等待进程调度的时间
    • 进程在CPU上的执行时间
    • 进程等待I/O操作完成的时间
  • 周转时间=作业完成时间 - 作业提交时间 
  • 平均周转时间 = 各作业周转时间之和 / 作业数 

等待时间

指进程/作业处于等待处理机I/O设备为其服务的状态时间之和,等待时间越长,用户满意度越低
 

响应时间

响应时间:从用户提交请求,到首次产生响应所用的时间

页面置换算法

1、最佳置换法(OPT)

最佳页面置换算法基本思路是,置换在「未来」最长时间不访问的页面。 这样可以保证最低的缺页率。 

实际系统中无法实现,无法预知每个页面在「下一次」访问前的等待时间。

此算法作用是为了衡量你的算法的效率,你的算法效率越接近该算法的效率,那么说明你的算法是高效的。

2、先进先出置换算法(FIFO)

既然我们无法预知页面在下一次访问前所需的等待时间,那我们可以选择在内存驻留时间很长的页面进行中置换。实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面队列的最大长度取决于系统为进程分配了多少个内存块。 

Belady异常—当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。

3、最近最久未使用置换算法(LRU)

发生缺页时,选择最长时间没有被访问的页面进行置换,也就是说,该算法假设已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。

实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t(该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大)。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。

LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类算法,理论上可以证明,堆栈类算法不可能出现Belady异常。

4、时钟置换算法(CLOCK)

所有的页面都保存在一个类似钟面的「环形链表」中,一个表针指向最老的页面。

当发生缺页中断时,算法首先检查表针指向的页面:

  • 如果它的访问位位是 0淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;

  • 如果访问位是 1 就清除访问位并把表针前移一个位置,重复这个过程直到找到了一个访问位为 0 的页面为止;

5、改进型的时钟置换算法

简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。

因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。

6、最不常用算法

当发生缺页中断时,选择「访问次数」最少的那个页面,并将其淘汰。 对每个页面设置一个「访问计数器」,每当一个页面被访问时,该页面的访问计数器就累加 1。在发生缺页中断时,淘汰计数器值最小的那个页面。

LFU 算法只考虑了频率问题,没考虑时间的问题, 去时间里访问的频率很高,但是现在已经没有访问了 。那这个问题的解决的办法还是有的,可以定期减少访问的次数。

7、总结

算法规则 优缺点
OPT 优先淘汰最长时间内不会被访问的页面 缺页率最小,性能最好;但无法实现
FIFO 优先淘汰最先进入内存的页面 实现简单;但性能很差,可能出现Belady异常
LRU 优先淘汰最近最久没访问的页面 性能很好;但需要硬件支持,算法开销大
CLOCK (NRU) 循环扫描各页面 第一轮淘汰访问位=0的,并将扫描过的页面访问位改为1。若第-轮没选中,则进行第二轮扫描。 实现简单,算法开销小;但未考虑页面是否被修改过。
改进型CLOCK (改进型NRU) 若用(访问位,修改位)的形式表述,则 第一轮:淘汰(0,0) 第二轮:淘汰(O,1),并将扫描过的页面访问位都置为0 第三轮:淘汰(O, 0) 第四轮:淘汰(0, 1) 算法开销较小,性能也不错

常见的几种磁盘调度算法

磁盘调度算法的目的很简单,就是为了提高磁盘的访问性能,一般是通过优化磁盘的访问请求顺序来做到的。

寻道的时间是磁盘访问最耗时的部分,如果请求顺序优化的得当,必然可以节省一些不必要的寻道时间,从而提高磁盘的访问性能。

1. 先来先服务

按照磁盘请求的顺序进行调度。

优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

2. 最短寻道时间优先

优先选择从当前磁头位置所需寻道时间最短的请求

虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。产生饥饿的原因是磁头在一小块区域来回移动

3. 扫描算法

磁头在一个方向上移动,访问所有未完成的请求,直到磁头到达该方向上的最后的磁道,才调换方向,这就是扫描(Scan)算法

优化:磁头在移动到「最远的请求」位置,然后立即反向移动。

4. 循环扫描算法

总是按相同的方向进行扫描,复位磁头,并且返回中途不处理任何请求,该算法的特点,就是磁道只响应一个方向上的请求

优化:磁头在移动到「最远的请求」位置,然后立即复位磁头

猜你喜欢

转载自blog.csdn.net/shisniend/article/details/131863492