操作系统导论-虚拟化结尾篇·一

自我留意点:

这个知识点是我自身容易忘记的点,插个眼

陷阱

在计算机中存在两种运行模式:用户态, 内核态。用户态,简单的来说就是我们正常使用电脑时,我们所行使的一些基本功能,如复制,存文档类。内核态,就是进行接近系统内部的东西,简单例如:我们使用音响这类底层硬件资源。而在操作系统运行在内核态时,在内核态中,操作系统具有对所有硬件的完全访问权限,可以使机器运行任何指令,用户态下,却无法进行,这时候当我们要使用底层硬件时就会出现问题,这时候要如何处理,就需要用到陷阱指令,这可以让我们进入内核态行使内核态的功能,这样我们就能正常使用,如操作时出现使用管理员身份操作。

调度

多级反馈队列-提要

多级反馈队列需要解决两方面的问题。首先,它要优化周转时间。这通过先执行短工作来实现。然而,操作系统通常不知道工作要运行多久,而这又是 SJF(或 STCF)等算法所必需的。

其次,MLFQ 希望给交互用户很好的交互体验,让用户能够及时或者更短的使用到对应的资源或者功能,缩短响应时间。轮转是降低了响应时间,但在周转时间显示出不足。

当我们对进程一无所知,如何去调度程序来实现我们的目标?
而多级反馈队列着解决了这个问题(起码提出了一个方法)操作系统中有很多地方采用了这种技术
(同样存在于计算机科学领域的很多其他地方,比如硬件的分支预测及缓存算法)。当然,必须十分小心地使用这种技术,因为它可能出错,让系统做出比一无所知的时候更糟的决定。

MLFQ:基本规则

MLFQ 中让独立的队列有优先级 MLFQ 会优先执行较高优先级的工作,在与其他工作相比之下。
当然,会出现具有同样的优先级的工作。在这种情况下,采用之前轮转调度(雨露均沾)。
MLFQ 调度在设置优先级时没有为每个工作指定不变级别。多级反馈队列根据观察到的行为调整它的优先级。如降低某项行为,如长期等女朋友回信息,却一直没有回信,则降低这样的等待的优先级,在CPU也是如此相,如果一个工作长时间地占用 CPU MLFQ 会降低其优先级。通过这种方式, MLFQ 在 进程运行过程中学习其行为,从而利用工作的历史来预测它未来的行为。
至此,我们得到了 MLFQ 的两条基本规则。
规则 1 :如果 A 的优先级 > B 的优先级,运行 A (不运行 B )。
规则 2 :如果 A 的优先级 = B 的优先级,轮转运行(课本原话)
A B。 如果要在某个特定时刻展示队列,可能会看到如下内容
最高优先级有两个工作(A B), 工作 C 位于中等优先级,而 D 的优先级最低。按刚才介绍的
基本规则,由于 A B 有最高优先级,调度程序将交替的调 度他们,可怜的 C 和 D 永远都没有机会运行, 当然,这只是展示了一些队列的静态快照,并不能让你 真正明白 MLFQ 的工作原理。我们需要理解工作的优先级如 何随时间变化。初次拿起本书阅读一章的人可能会吃惊,这
正是我们接下来要做的事。
步骤1:改变优先级
在一个工作的生命周期中, MLFQ 改变其优先级时,观察工作负载:既有运行时间很短、频繁放弃 CPU 的交互型工作, 也有需要很多 CPU 时间、响应时间却不重要的长时间计算密集型工作。下面是我们第一次 ,去优先级调整算法。
规则 3 :工作进入系统时,放在最高优先级(最上层队列)(课本原话)。
规则 4a :工作用完整个时间片后,降低其优先级(移入下一个队列)。
规则 4b :如果工作在其时间片以内主动释放 CPU
则优先级不变。
队列的调度程序中,随着时间的推移,这个工作的运行 情况。 时间工作随时间的变化
尝试 1 :如何改变优先级
看一个较复杂的例子,看看 MLFQ 如何近似 SJF 。有两个工作:A 是一个长时间运行的 CPU 密集型工作, B 是一个运行时间很短的交互型工作。假设 A 执行 一段时间后 B 到达。会发生什么呢?对 B 来说, MLFQ 会近似于 SJF 吗?
A在最低优先级队列执行(长时间运行 的 CPU 密集型工作都这样)。 B 在时间 T =100 时到达,并被加入最高优先级 队列。由于它的运行时间很短(只有 20ms),经过两个时间片,在被移入最低优先级队列之 前, B 执行完毕。然后 A 继续运行(在低优先级)。如果不知道工作是短工
作还是长工作,那就先让他们先工作一段时间,先给开始短工作的赋予最高优先级。如果确实是短
工作,则很快会执行完毕,否则将被慢慢移入低优先级队列,而这时该工作也被认为是长
工作了。通过这种方式, MLFQ 近似于 SJF
在I/O 中 。根据上述规则 4b ,如果进程在时间片用完之前主动放弃 CPU, 则保持它的优先级不变。这条规则的意图很简单:假设交互型工作中有大量的 I/O 操作 如:等待输入,它会在时间片用完之前放弃 CPU。在这种情况下,我们不想处罚它,只是保持它的优先级不变。 交互型工作 B 每执行 1ms 便需要进行 I/O 操作,它与长时间运行的工作 A (用黑色表示)竞争 CPU MLFQ 算法保持 B 在最高优先级,因为 B 总是让出 CPU 。如果 B 是交互型工作,MLFQ 就进一步实现了它的目标,让交 互型工作快速运行。

MLFQ 问题

在长工作能够公平使用 CPU ,又能给短工作或交互型工作很好的响应时间。
但有一些非常严重的缺点。如果出现 饥饿问题。系统有“太多”交互型工作,就会不断占用 CPU,导致长工作永远无法得到 CPU。

提升优先级

 为避免饥饿问题。又要让 CPU 密集型工作也能取得一 些进展。
我们可以采取一个简单的思路是周期性地提升 所有工作的优先级。
将所有工作扔到最高优先级队列。
规则 5 :经过一段时间 S ,就将系统中所有工作重新加入最高优先级队列。
这解决
1.进程不会饿死——在最高优先级队列中,它会以轮转的方式,与其他高优先级工作分享 CPU ,从而最终获得执行。
2.如果一个 CPU 密集型工作变成了交互型,当它优先级提升时,调度程序会正确对待它。
当长工作与两个交互型短工作竞争 CPU,没有优先级提升,长工作将会被短工作到达后被饿死。有周期就有一次优先级提升,能至少保证长工作能够进行,每周期 就被提升到最高优先级。
但在这里时间段 S 的值应该如何设置? 。如果 S 设置得太高,长工作会饥饿;如果设置得太低,交互型工作又 得不到合适的 CPU 时间比例。

更好的计时方式

规则 4a 4b ,导致工作在时间片以内释放 CPU,就保留它的优先级。在  MLFQ 的每层队列提供更完善的 CPU 计时方式在调度程序应该记录一个进程在某一层中消耗的总时间,而不是在调度时重新计时。只要进 程用完了自己的配额,就将它降到低一优先级的队列中去。不论它是一次用完的,还是拆成很多次用完。
新规则 4:一旦工作用完了其在某一层中的时间配额(不管自主放弃了多少次 CPU),就降低其优先级进入下个优先级。 
在没有规则 4 的保护时,进程可以在 每个时间片结束前发起一次 I/O 操作,从而垄断 CPU 时间。有了这样的保护后,不论进程 的 I/O 行为如何,都会慢慢地降低优先级,这样却无法获得超过公平的 CPU 时间比例

MLFQ 调优及其他问题

如何配置一个调度程序,配置多少队列?每一层队列的时间片配置多大?为了避免饥饿问题以及进程行为改变,应 该多久提升一次进程的优先级?这些问题都没有显而易见的答案,因此只有利用对工作负载的经验,以及后续对调度程序的调优,才会导致令人满意的平衡。
在高优先级队列通常只 有较短的时间片 ,这一层的交互工作可以更快地切换。
低优先级队列中更多的是 CPU 密集型工作,配置更长的时间片会取得更好的效果。

避免巫毒常量(Ousterhout 定律)

让系统自己去学习一个很优化的值,但需要我们写满各种参数值默认值的一个配置文件,使得系统管理员可以方便地进行修改调整。
Solaris MLFQ 实现时分调度类 TS很容易配置。它提供了一组表来决定进程在其 生命周期中如何调整优先级,每层的时间片多大,以及多 久提升一个工作的优先级 [AD00] 。管理员可以通过这
表,让调度程序的行为方式不同。该表默认有 60 层队列, 时间片长度从 20ms(最高优先级),到几百 ms(最低优先级),每一秒左右提升一次进程的优先级。 其他一些 MLFQ 调度程序没用表,甚至没用本章中讲到的规则,有些采用数学公式来调整优先级。有些调度程序将最高优先级
队列留给操作系统使用,因此通常的用户工作是无法得到系统的最高优先级的。有些系统
允许用户给出优先级设置的建议 ,比如通过命令行工具 ,可以增加或降低工 作的优先级从而增加或降低它在某个时刻运行的机会

MLFQ:小结

多级反馈队列( MLFQ)
多级队列,并利用反馈信息决定某个工作的优先级,关注进程。 
让操作系统很少知道什么策略对系统中的单个进程和每个进程算是好的,因此提供接口并允许用户或管理员给操作系统一些提示,因为操作系统不一定要关注它, 但是会考虑在内,以便做出更好的决定。这种用户建议的方式在操作系统中的各个领域经常十分 有用,包括调度程序(通过 nice )、内存管理( madvise ),以及文件系统(通知预取和缓存)
MLFQ 不需要对工作的运行方式有先验知识,通过观察工作的 运行来给出对应的优先级。通过这种方式, MLFQ 可以同时满足各种工作的需求:对于短 时间运行的交互型工作,获得类似于 SJF/STCF 的很好的全局性能,同时对长时间运行的 CPU 密集型负载也可以公平地、不断地稳步向前。因此,许多系统使用某种类型的 MLFQ作为自己的基础调度程序

MLFQ规则

规则 1 :如果 A 的优先级 > B 的优先级,运行 A (不运行 B )。
规则 2 :如果 A 的优先级 = B 的优先级,轮转运行 A B
规则 3 :工作进入系统时,放在最高优先级(最上层队列)。
规则 4 :一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次
CPU ),就降低其优先级(移入低一级队列)。
规则 5 :经过一段时间 S ,就将系统中所有工作重新加入最高优先级队列。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值