《操作系统导论》(OSTEP)进程调度部分读书笔记

OSTEP

Chapter 7 进程调度: 介绍

7.2 调度指标

任务的周转时间定义为任务完成时间减去任务到达系统的时间

T 周转时间 = T 完成时间 − T 到达时间 T_{周转时间} = T_{完成时间}-T_{到达时间} T周转时间=T完成时间T到达时间

周转性能是其中一个性能指标, 另一个性能指标是公平, 性能和公平在调度系统中往往是矛盾的, 例如, 调度系统可以优化性能, 但代价是阻止一些任务运行, 这就降低了公平

7.3 先进先出(FIFO)

最基本的调度算法, 称为 先进先出调度 , 也称为 先来先服务

FIFO有时候表现并不好. 例如, 三个任务A, B, C, 按照次序进行调度, A运行100s, B, C各运行10s. 假设执行这三个任务, 那么A需要先运行100s, 之后B, C才能运行, 系统的平均周转时间就很高. 这个问题又被称为 护航效应 , 一些耗时较少的潜在资源消费者被排在重量级的资源消费者之后

7.4 最短任务优先(SJF)

最短任务有限代表一个总体调度原则, 可以应用于所有系统, 只要其中平均客户周转时间很重要

新的调度准则被称为 最短任务优先 : 先运行最短的任务, 然后是次短的任务, 如此下去

但是SJF有时候表现也不好. 例如A在 t = 0 t = 0 t=0 时到达, 且需要运行 100s, 而B 和 C 在 t = 10 s t = 10s t=10s 到达, 且各需要运行10s, 这样即使B和C在A不久之后到达, 它们仍然需要等待A完成, 这样又出现了和FIFO同样的护航效应问题.

7.5 最短完成时间优先(STCF)

最短完成时间优先 : 向SJF添加抢占, 称为最短完成时间优先或抢占式最短作业优先调度

每当新工作进入系统之后, 它就会确定剩余工作和新工作中谁的剩余时间最少, 然后调度该工作

结果就是, 平均周转时间大大提高了

7.6 响应时间

响应时间定义为从任务到达系统到首次运行的时间.

T 响应时间 = T 首次运行 − T 到达时间 T_{响应时间} = T_{首次运行} - T_{到达时间} T响应时间=T首次运行T到达时间

STCF和相关方法在响应时间的表现上并不是很好, 例如, 如果3个工作同时到达, 第三个工作需要等到前两个工作完成之后才能运行, 这种方法的响应时间和交互性是相当糟糕的

7.7 轮转

为了解决上面的问题, 有一种新的调度方法: 轮转(RR)调度 , 其基本思想是: RR在一个时间片内运行一个工作, 然后切换到运行队列的下一个任务, 而不是运行一个任务直到结束, 它反复执行, 直到所有任务完成, 因此RR有时也被称为时间切片. 请注意: 时间片长度必须是时钟中断周期的倍数

系统设计者需要权衡时间片的长度, 使其足够长, 以便摊销上下文切换成本, 而又不会使系统不及时响应

程序运行时, 它们在CPU高速缓存, TLB, 分支预测器和其他片上硬件中建立了大量的状态, 切换到另一个工作会导致此状态被刷新, 且与当前运行的作业相关的新状态被引入, 这可能导致显著的性能成本

任何公平的政策(如RR), 即在小规模的时间内将CPU均匀分配到活动进程之间, 在周转时间这类指标上表现不佳

7.8 结合I/O

调度程序显然要在工作发起I/O请求时做出决定, 因为当前正在运行的作业在I/O期间不会使用CPU, 它被阻塞等待I/O完成

调度程序还必须在I/O完成时做出决定, 发生这种情况时, 会产生中断, 操作系统运行并将发出I/O的进程从阻塞状态移回就绪状态

假设有两项工作A和B, 每项工作需要50ms的CPU时间, 这两个唯一的区别在于: A运行10ms, 然后发出I/O请求, 而B只是使用CPU50ms, 不执行I/O. 调度程序先运行A再运行B

一个常见的方法是将A的每个10ms的子工作视为一个独立的工作, 因此对于STCF, 选择较短的工作, 即选择A, 然后A的工作完成, 只剩下B, 并开始运行, 然后提交A的一个新的子工作, 如此反复实现 重叠 , 也就是 一个进程再等待另一个进程的I/O完成时使用CPU , 系统得到更好的利用

当交互性作业正在执行I/O时, 其他CPU密集型作业将运行, 从而更好地利用处理器

Chapter 8 调度: 多级反馈队列

8.1 多级反馈队列(MLFQ)的基本规则

MLFQ中有许多独立的队列, 每个队列有不同的 优先级 , 任何时刻一个工作只能存在于一个队列中, MLFQ总是优先执行 较高优先级的工作

每个队列中可能有多个工作, 具有同样的优先级, MLFQ对这些工作采用 轮转调度

MLFQ根据对进程的观察调整对它的优先级. 例如一个工作不断放弃CPU去等待键盘输入, 这是交互型进程的可能行为, MLFQ就会让它保持高优先级, 相反如果一个进程长时间占用CPU, MLFQ会降低其优先级. MLFQ在进程运行过程中学习其行为, 从而利用工作的历史来预测它未来的行为

因此得到了MLFQ的两条基本规则

  • 规则1: 如果A的优先级 > B的优先级, 运行A

  • 规则2 : 如果A的优先级 = B的优先级, 轮转运行A和B

8.2 如何改变优先级?

我们试图调整进程的优先级, 以下是MLFQ对于进程优先级调度的一些规则

  • 规则3 : 工作进入系统时, 放在最高优先级
  • 规则4a : 工作用完整个时间片之后, 降低优先级
  • 规则4b : 如果工作在其时间片以内主动释放CPU, 优先级不变

当前MLFQ可能存在的问题: 饥饿问题 , 如果系统有太多的交互型工作, 就会不断占用CPU, 导致长工作永远无法得到CPU

其次, 一些程序可能会愚弄调度程序, 例如进程在时间片用完之前, 执行一次I/O操作, 从而主动释放CPU, 从而保持自己的优先级不变, 这样工作几乎可以独占CPU

最后, 一个程序可能在不同时间内表现不同, 一个计算密集的进程可能在某段时间表现为一个交互型的进程, 用目前MLFQ的调度方法它不会享受系统其他交互型工作的待遇

8.3 提升进程的优先级

为了让CPU密集型工作也能取得进展, 一种方法是周期性地提升所有工作的优先级

  • 规则5 : 经过一段时间S, 就将系统中所有工作重新加到最高优先级队列

添加时间S也会带来一定的问题, 如果S设置时间太长, 也会出现饥饿问题, 如果设置太低, 交互型工作又得不到合适的CPU时间比例

8.4 更好的计时方式

调度程序应该记录一个进程在某一个优先级消耗的总时间, 而不应该是在调度时重新计时, 只要进程用完了自己的时间配额, 就把它降到更低一级的队列去, 无论是一次性用完还是分多次用完

因此得到重写之后的规则4

  • 规则4: 一旦工作用完了在某一层的时间配额(无论中间主动放弃了多少次CPU), 就降低其优先级

8.6 小结

完整的MLFQ规则如下:

  • 规则1 : 如果A的优先级 > B的优先级, 运行A

  • 规则2 : 如果A的优先级 = B的优先级, 轮转运行A和B

  • 规则3 : 工作进入系统时, 放在最高优先级(最上层队列)

  • 规则4: 一旦工作用完了其在某一层的时间配额(无论中间主动放弃了多少次CPU), 就降低其优先级

  • 规则5 : 经过一段时间S, 就将系统中所有工作重新加到最高优先级队列

MLFQ不需要对工作的运行方式有先验知识, 而是通过观察工作的运行来给出对应的优先级, 通过这种方式, MLFQ可以同时满足各种工作的需求: 对于短时间运行的的交互型工作, 获得类似于SJF/STCF一样很好的全局性能, 同时对于长时间运行的CPU密集型工作也可以公平地运行

Chapter 9 调度 : 比例份额

比例份额算法基于一个简单的想法: 调度程序的最终目标是确保每个工作获得一定比例的CPU时间, 而不是优化周转时间和响应时间

比例份额调度程序有一个很典型的例子 : 彩票调度. 彩票调度的基本思想如下: 每隔一段时间都会进行一次抽奖, 以确定接下来运行哪个进程, 越是频繁运行的进程, 越是应该拥有更多地获得彩票的机会

9.1 彩票数表示份额

彩票数代表了进程占有某个资源的份额, 一个进程拥有的彩票数占总彩票数的百分比, 就是它占有资源的份额

通过不断定时地抽取彩票, 彩票调度从概率上获得这种份额比例, 过程如下: 调度程序知道总共的彩票数, 调度程序抽取中奖彩票, 这是从 0 到 总彩票数-1之间的一个数, 拥有这个数对应的进程中奖

彩票调度最精彩的地方在于利用了随机性, 相比于其他传统方法, 它的优势有: 第一, 可以避免奇怪的边角情况, 第二, 随机方法很轻量, 不需要记录任何状态, 第三, 随机方法很快

彩票调度中利用率随机性, 这导致了从概率上满足期望的比例但不完全确保. 但是工作的时间越长, 得到的CPU时间比例就越接近期望

9.2 彩票机制

彩票调度还提供了一些机制, 以不同且有效的方式调度进程

一种方式是利用彩票的货币概念, 这种方式允许拥有一组彩票的用户以他们喜欢的某种货币, 将彩票分给自己的不同工作, 之后操作系统再自动将这种货币兑换成正确的全局彩票

另一种方式是彩票转让. 通过转让, 一个进程可以临时将字节的彩票交给另一个进程, 这种机制在客户端/服务端交互的场景中尤其有用

最后一种方式是彩票通胀. 通过通胀, 一个进程可以临时提升或降低自己拥有的彩票数量. 一般用于进程之间相互信任的环境

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值