操作系统课堂笔记四-处理器调度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/g8433373/article/details/88229882

处理器调度

  • 处理器调度也就是CPU调度, 本章主要讲一些调度的概念, 算法, 批处理, 交互式, window系统中的一些算法

概念

  • cpu调度: 控制协调多个进程对CPU的竞争, 本质上就是按照一定调度算法从就绪队列中选择一个进程将CPU控制权转交给被选中进程。

ps.如果没有就绪进程, CPU会安排一个空闲进程给CPU运行

  • 思考:
    • N个就绪进程, 等待上CPU运行
    • M个CPU M>=1
    • CPU将控制权分配给哪个进程?
  • 调度的三个核心点
    • 调度算法
    • 调度时机
      • 进程正常终止
      • 进程由于某种错误终止
      • 新进程创建
      • 等待进程->就绪进程 或 运行->等待
      • 时间片到等因素 从运行->就绪
    • 调度过程
      • 如果是新进程需要进行进程切换

上下文切换

场景

  • 进程A下CPU, 进程B上CPU
    • A先保存上下文: 包括寄存器(PC, PSW),通用寄存器等
    • 更新A的PCB(A状态改变了)
    • 把进程A挪至相关队列(就绪, 阻塞)
    • 将B的状态设置为运行态
    • 从进程B的PCB中恢复上下文(寄存器状态的恢复)

上下文切换开销

  • 直接开销: 内核完成上下文切换所花费的时间
    • 保存恢复寄存器
    • 切换地址空间(这一部分代价很大)
  • 间接开销
    • 高速缓存, 缓冲区缓存, TLB失效

调度算法

关键点

  • 用户角度
    • 周转时间: 提出请求到完成的时间
    • 响应时间: 从进程提出到首次回应的时间
    • 程序ddl(用户希望能知道最后运行时间)
    • 等待时间: 进程在就绪队列中等待的时间
  • 系统角度
    • 吞吐量: 单位时间内完成进程的数量
    • CPU利用率: 有效工作的比例
  • 占用CPU的方式
    • 抢占式: 优先级更高的进程可以强行剥夺正在运行进程的CPU,即使时间片没有用完
    • 非抢占式: 除非自身原因让出CPU 否则一直运行
  • I/O密集型 和 CPU密集型
    • I/O密集型 : 大部分时间等待IO结果
    • CPU密集型: 又叫计算密集型, 需要大量

批处理系统调度算法

  • 先来先服务(FIFO): 按照进程就绪先后顺序使用CPU, 非抢占
    • 优先: 实现简单
    • 缺点: 容易造成短任务得不到响应
  • 最短作业优先(SJF): 完成时间最短的优先执行
    • 加了抢占式: 新就绪的进程完成时间短于当前进程就会主动抢占
    • 优点: 能够得到最短的平均周转时间(前提是所有进程可运行)
    • 缺点: 一直有短任务到来, 导致长任务长时间得不到资源
  • 最短剩余时间优先(SRNT)
  • 最高响应比优先(HRRN: Highest Response Ratio Next)
    • 调度时计算响应比R, 选择最大的R
    • R = 周转时间/处理时间 = (等待时间+处理时间)/处理时间 = 1 + (等待时间/处理时间)

交互式系统调度算法

  • 追求指标: 响应时间

  • 时间片轮转

    • 所有进程按照时间片顺序运行, 运行完成了时间片的任务会排在任务的队尾
    • 核心是通过时钟中断
    • 时间片过长: 容易变成先进先出
    • 时间片过短: 浪费CPU时间
    • 优点: 公平, 利于交互
    • 缺点: CPU开销(进程切换需要保存上下文)

    ps.对于IO型进程和CPU型进程而言, 系统会对IO进程设置一个辅助队列, 因为IO进程往往用不完时间片就去等待了。下一次CPU会优先调度辅助队列中的内容

  • 最高优先级调度

    • 概念: 总是选择优先级最高的进程执行
    • 常规优先级
      • 系统进程>用户进程
      • 前台进程>后台进程
      • I/O进程>CPU进程
    • 优点: 实现简单
    • 缺点: 容易产生饥饿
    • 优先级反转问题
      • 高优先级想要低优先级的资源, 低优先级等到中优先级的CPU 高中低优先级进程都得不到执行
      • 解决方案: 设置优先级上限, 优先级继承, 使用禁止中断(进入临界区的进程不再响应中断)
  • 多级反馈队列调度算法(重点)

    • 系统会按照优先级分配很多队列, 优先级越高, 时间片越短
    • 刚创建的进程进入最高优先级队列
    • 时间片运行完成的进程进入下一优先级
    • 系统按照时间片轮转来调度进程, 一级队列任务为空则调度二级队列, 以此类推
    • 有些进程时间片没有运行完就去等待IO了, 这一类进程在不同操作系统下有不同的对应办法
      • 事件等待到来后 是进入该队列队尾还是队首
      • 再次被调度是否重新分配时间片还是运行剩余时间片
    • 如果允许抢占, 那么优先级更高的进程可以抢占正在CPU上运行的进程。被强占的进程回到队首或队尾, 看场景. 这种被强占的也是看场景是否给满时间片

调度算法比较

  • 各种调度算法比较,转自这里
    在这里插入图片描述
  • 调度算法需要考虑的问题
    • 是否需要频繁的切换CPU, 以及切换的是否是同一个CPU, 有可能导致TLB和高速缓存失效的问题
    • 负载均衡的问题(不能让某些CPU很忙碌, 其他CPU一直空闲)

典型操作系统调度算法

Unix

  • 采用动态优先数

5.3BSD

  • 多级反馈队列

Linux

  • 抢占式调度
  • 发展历程: 2.4(基于优先级)->2.6(O(1)调度算法)->SD调度器补丁->RSDL调度器补丁->CFS调度算法(完全公平调度算法)

WIndows

  • 基于优先级的抢占式多任务调度

Windows的线程调度

  • 调度单位是线程
  • 采用基于动态优先级的, 抢占式调度, 结合时间配额的调整
  • 调度步骤
    • 按照就绪线程优先级进入相应队列
    • 系统选择优先级最高的线程运行
    • 相同优先级的线程按照时间片轮转
    • 多CPU系统允许多线程并行运行
  • 调度条件
    • 一个线程优先级改变了
    • 一个线程改变了它的亲和处理机
    • 线程正常终止或由于某种错误而终止
    • 新线程创建或一个等待线程变成就绪
    • 当线程从运行态->阻塞或者就绪态
  • windows分为32个线程优先级
    • 0: 系统优先级(一般用来页面清零)
    • 1-15: 可变优先级
    • 16-31: 实时优先级(不可变优先级)
  • 时间配额
  • 调度策略
    • 主动切换: 某个线程因为等待IO 会自动转换到等待队列, 系统会从就绪队列中寻找新的任务
    • 抢占: 从阻塞被唤醒后的任务会抢占当前任务CPU ,被抢占任务会回到队列的队首。 如果被抢占任务属于 实时优先级, 那么下一次运行的时间会分配一个完整的时间配额。如果被抢占任务属于可变优先级, 得到CPU后只会运行剩余的时间片。
    • 时间配额用完
      • 任务优先级不降低: 分配到原来优先级队列末尾
      • 任务优先级降低: 降低到优先级更低的队列
  • 线程优先级提升的几种情况(针对可变优先级的线程)
    • I/O操作结束
    • 信号量或事件等待结束
    • 前台进程中的线程完成一个等待操作
    • 被唤醒的线程
    • 处于饥饿的线程

Solaris

  • 综合调度算法

参考

[1] 操作系统原理

猜你喜欢

转载自blog.csdn.net/g8433373/article/details/88229882