操作系统处理器调度

1 背景

1.1 上下文切换:

  • 切换CPU的当前任务, 从一个进程/线程到另一个
  • 保存当前进程/线程在PCB/TCB中的执行上下文(CPU状态)
  • 读取下一个进程/线程的上下文

1.2 CPU调度:

  • 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
  • 调度程序: 挑选进程/线程的内核函数(通过一些调度策略)
  • 什么时候进行调度?

1.3 内核运行调度程序的条件(满足一条即可):

  • 一个进程从运行状态切换到等待状态
  • 一个进程被终结了

1.4 抢占式调度

大部分时候应用程序在运行的过程中是以用户态进程的形式存在的, 一旦启动了一个进程之后, 就会存在两种情况, 可抢占和不可抢占:

不可抢占:

  • 调度程序必须等待事件结束

可以抢占:

  • 调度程序在中断被相应后执行
  • 当前的进程从运行切换到就绪, 或者一个进程从等待切换到就绪
  • 当前运行的进程可以被换出

是否可以抢占: 当一个用户进程执行系统调用, 如果系统调用在内核中不会导致这个进程处于等待状态, 这个调用正常返回会返回到发起这个系统调用的进程继续执行, 即不会在内核中发生抢占现象, 称为内核的不可抢占. 如果系统调用期间, 内核切换到了别的进程执行,  那么返回到用户态会返回到另一个用户进程, 称为内核的可抢占.

2 调度原则

2.1 调度策略

2.2 程序执行模型

程序在CPU突发和I/O中交替:

  • 每个调度决定都是关于在下一个CPU突发时将哪个工作交给CPU
  • 在时间分片机制下, 线程可能在结束当前CPU突发前被迫放弃CPU

2.3 比较调度算法的准则

  • CPU使用率: CPU处于忙状态所占时间的百分比
  • 吞吐量: 在单位时间内完成的进程数量
  • 周转时间: 一个进程从初始化到结束
  • 等待时间: 进程在就绪队列中的总时间
  • 响应时间: 从一个请求被提交到产生第一次响应所花费的总时间

评价快慢的一些指标:

  • 传输文件时的高带宽
  • 玩游戏时的低延迟
  • 这两个因素是独立的

2.4 吞吐量VS延迟

调度算法的目标:

  • 减少响应时间: 从而及时处理用户的输出并且尽快将输出提供给用户
  • 减少平均响应时间的波动: 在交互系统中, 可预测性比高差异低平均更重要
  • 增加吞吐量, 体现在两个方面: 1. 减少开销(操作系统开销, 上下文切换). 2. 系统资源的高效利用(CPU, I/O设备)
  • 减少等待时间: 减少每个进程的等待时间.

低延迟调度增加了交互式表现, 如果移动了鼠标, 但是屏幕中的光标却没动, 体验就会很差. 但是操作系统需要保证吞吐量不受影响, 想要结束长时间的编程, 所以操作系统必须不时进行调整, 即使存在许多交互任务. 吞吐量是操作系统的计算带宽, 响应时间是操作系统的计算延迟.

2.5 公平的目标

调度算法需要确立一个公平的目标, 不过这个怎么定义呢? 比如保证每个进程占用相同的CPU时间, 但是这样的话一个用户比其他用户运行更多进程怎么办. 比如保证每个进程都等待相同的时间, 公平通常会增加平均响应时间.

3 调度算法

3.1 FCFS

FCFS: 先来先服务, 即如果进程在执行中阻塞, 队列中的下一个进程会得到CPU

举例:

假设有三个任务P1, P2, P3, 执行时间分别是12, 3, 3. 

  • 首先, 当任务到达顺序为P1, P2, P3时, 如图:

  • 当任务到达顺序为P2, P3, P1时, 如图:

FCFS特点:

优点:

简单

缺点:

  • 平均等待时间波动较大
  • 花费时间少的任务可能排在花费时间长的任务后面
  • 可能导致I/O和CPU之间的重叠处理(CPU密集型进程会导致I/O设备闲置时, I/O密集型进程也在等待)

3.2 SPN(SJF) SRT

SPN(SJF) SRT: 短进程优先(短作业优先), 短剩余时间优先, 选择下一个最短的进程, 按照预测的完成时间来将任务入队.

可以是可抢占的或者不可抢占的:

  • 可抢占, 又叫Shortest-Remaining-Time(SRT: 最短剩余时间), 执行程序可打断, 并根据剩余执行时间重新确定优先级
  • 不可抢占, 执行程序不可打断

这种方法的平均等待时间是最小的.

缺点:

  • 可能导致饥饿
  • 连续的短任务流会使长任务饥饿
  • 短任务可用时的任何长任务的CPU时间都会增加平均等待时间
  • 需要预知未来(预测等待时间算法)
  • 怎么预估下一个CPU突发的持续时间
  • 简单的解决方法: 询问用户
  • 如果用户欺骗就杀死进程
  • 如果用户不知道怎么办

3.3 HRRN

HRRN: 最高响应比优先, 在SPN调度的基础上改进, 不可抢占, 关注进程等待了多长时间, 防止无限期推迟

相应比:

R = (w + s) / s

  • w: waiting time: 等待时间
  • s: service time: 执行时间

3.4 Round Robin

Round Robin: 轮循, 使用时间切片和抢占来轮流执行任务, 在叫作量子, 或者时间切片的离散单元中分配处理器, 时间片结束时, 切换到下一个准备好的进程.

特点:

  • 花销: 额外的上下文切换
  • 时间量子太大的话: 等待时间就会过长, 极限情况退化成FCFS
  • 时间量子太小的话: 反映迅速, 但是...吞吐量由于大量的上下文切换开销受到影响

目标:

  • 选择一个合适的时间量子
  • 经验规则: 维持上下文切换开销处于1%以内

3.5 Multilevel Feedback Queue

Multilevel Feedback Queue: 多级反馈队列, 优先级队列中的轮循

  • 就绪队列被划分成独立的队列(比如: 前台/交互, 后台/批处理)
  • 每个队列拥有自己的调度策略(比如: 前台RR, 后台FCFS),
  • 调度必须在队列间进行

但是进程的执行过程进程的特点会发生变化, 根据这个问题可以有如下设计:

  • 一个进程可以在不同的队列中移动
  • 例如: n级优先级 - 优先级调度在所有级别中, RR在每个级别中:
  • 时间量子大小随优先级级别增加而增加
  • 如果任务在当前的时间量子中没有完成, 则降到下一个优先级

3.6 Fair Share Scheduling

Fair Share Scheduling: 公平共享调度

FSS控制用户对系统资源的访问

  • 一些用户组比其他用户组更重要
  • 保证不重要的组无法垄断资源
  • 未使用的资源按照每个组所分配的资源的比例来分配
  • 没有打到资源使用率目标的组获得更高的优先级

3.7 调度算法评价

  • 确定性建模: 确定一个工作量, 然后计算每个算法的表现
  • 队列模型: 用来处理随机工作负责的数学方法
  • 实现/模拟:
  • 建立一个允许算法运行实际数据的系统
  • 最灵活/具有一般性

4 实时调度

4.1 实时系统

定义:

正确性依赖于其时间和功能两方面的一种操作系统.

性能指标:

  • 时间约束的及时性(deadlines)
  • 速度和平均性能相对不重要

主要特性:

时间约束的可预测性

分类:

  • 强实时系统: 需要在保证的时间内完成重要的任务, 必须完成
  • 弱实时系统: 要求重要的进程优先级更高, 尽量完成, 并非必须

一些术语:

  • 任务(工作单元): 一次计算, 一次文件读取, 一次信息传递等等
  • 属性: 取得进展所需要的资源, 实时参数
  • 周期任务
  • 任务有规律的重复
  • 周期p = inter-release time (0 < p)
  • 执行周期e = 最大执行时间(0 < e < p)
  • 使用率U = e / p
  • 硬时限
  • 如果错过了最后期限, 可能会发生灾难性或非常严重的后果
  • 必须验证: 在最坏的情况下是否也能满足时限
  • 保证确定性
  • 软时限 
  • 理想情况下, 时限应该被最大满足. 如果有时限没有被满足, 那么就相应地降低要求
  • 尽最大努力去满足 

满足实时性要求的调度算法设计:

  • 决定实时任务执行的顺序
  • 静态优先级调度
  • 动态优先级调度 

4.2 可调度性

4.3 单调速率(RM)调度

  • 最佳静态优先级调度
  • 通过周期安排优先级
  • 周期越短优先级越高
  • 执行周期最短的任务

4.4 截止日期最早优先(EDF)

  • 最佳的动态优先级调度
  • Deadline越早优先级越高
  • 执行Deadline最早的任务

5 多处理器调度

多处理器的CPU调度更加复杂

  • 多个相同的单处理器组成一个多处理器
  • 优点: 负载共享

对称多处理器(SMP)

  • 每个处理器运行自己的调度程序
  • 需要在调度程序中同步

6 优先级反转

可以发生在任何基于优先级的可抢占的调度机制中, 当系统内的环境强制使高优先级任务等待低优先级任务时发生.

发生原因(图示):

  1. 假设此时操作系统中有三个优先级不同的进程, 低优先级进程P_{low}, 高优先级进程P_{high}和中优先级进程P_{mid}. 在t_{1}时刻P_{low}先开始运行(此时优先级较高的另外两个进程还没开始运行):
  2. P_{low}t_{2}时刻开始访问某个共享资源R:
  3. t_{3}时刻, P_{low}未对R访问完毕时, P_{high}开始跑了, 于是P_{low}被抢占:
  4. t_{4}时刻P_{high}需要访问此时被P_{low}占用的R, 由于P_{low}被抢占, 所以其占用的R还没有释放, 所以P_{high}开始等待R的释放而被挂起, 从而P_{low}继续执行(此时正在使用R):
  5. t_{5}时刻P_{low}还未使用完R之前, P_{mid}开始执行, 这样P_{low}又被抢占, 于是开始执行P_{mid}:
  6. 直到t_{6}时刻P_{mid}执行完毕, 然后继续执行P_{low}, P_{low}继续访问R:
  7. t_{7}时刻P_{low}使用完R之后, 释放了R, 然后P_{high}开始使用R, 直至P_{high}执行完毕:

优先级反转的持续时间取决于其他不相关任务的不可预测的行为, 如以上例子, P_{high}的执行时间被P_{low}以及P_{mid}影响.

解决办法:

  • 低优先级任务继承高优先级任务的优先级依赖于他们共享的资源. 如以上例子, P_{high}在访问R时由于此时R正在被P_{low}所占用, 所以P_{low}的优先级会动态得到提升至和P_{high}相同(因为RP_{low}占用的原因), 使得P_{low}不被P_{mid}抢占.
  • 优先级天花板
  • 优先级天花板: "资源"的优先级和"所有可以锁定该资源的任务中优先级最高的那个任务"的优先级相同, 如以上例子, R的优先级跟P_{high}的优先级相同.
  • 除非优先级高于系统中所有被锁定的资源的优先级上线, 否则任务尝试执行临界区的时候会被阻塞. 如以上例子, P_{low}占用R执行时, 除非再来一个进程的优先级高于此时资源的优先级, 也就是R的优先级, 也就是P_{high}的优先级, 其可以抢占CPU执行, 否则就会被阻塞, 也就是P_{mid}过来时会被阻塞.
  • 持有最高优先级上限信号量的任务, 会继承被该锁所阻塞的任务的优先级.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值