持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
要解决的问题:
- 何时(调度机会)何时将CPU分配给进程?
- (调度算法)分配原则是什么?
- 如何(上下文切换)如何分配CPU?
什么是调度: 决定哪个进程/线程应该占用资源(CPU、磁盘等)
何时调度:
- 新进程开始,决定运行父进程还是子进程
- 正在运行的进程退出
- 正在运行的进程被阻塞(I/O或者信号量原因)
- 输入/输出中断(某些进程将准备就绪)
- 时钟中断(例如,每10毫秒一次)
调度算法目标:所有系统的
- 公平: 任何进程都不应挨饿。
- 策略实施: 确保所述政策得到执行。
- 效率: 使资源尽可能繁忙
*七状态模型
*长期、中期、短期调度
- 长期调度器将尝试保持处理器绑定和I/O绑定进程的混合。
- 中期调度:根据管理多道程序的需要交换决策。
- 短期调度:确定下一个将执行哪个进程(也称为CPU调度):在可能导致选择另一个进程执行的事件上调用:
- 时钟中断
- 输入/输出中断
- 操作系统调用和陷阱
- 信号
进程行为
CPU突发事件(burst脉冲) 进程需要CPU的一段时间称为CPU突发。 输入/输出burst 进程需要I/O的一段时间称为I/O突发。
- 计算密集型(CPU-bound)进程
- 较长时间的CPU集中使用和较小频率的IO等待
- IO密集型(IO-bound)进程
- 较短时间的CPU集中使用(短CPU脉冲)和频繁IO等待
调度算法 prepared
Preemptive vs. Non-preemptive
首先区分抢占式和非抢占式调用 Preemptive vs. Non-preemptive:
- 抢占式调度: 运行过程可能会中断,必须释放CPU(可能会被迫放弃CPU)
- 非抢占式调度: 运行进程保留CPU,直到它自愿放弃CPU,比如:
- 进程退出。
- 切换到阻塞状态
- 仅1和4(3号)
算法目标
- 批处理系统:
- 吞吐量 单位时间内处理的作业数。
- 周转时间 从提交到完成的时间(批处理作业)。
- 处理器利用率 CPU忙的时间百分比。
- 交互式系统:
- 响应时间 从首次提交请求到生成第一个响应的时间量。
- 相称性Proportionality 满足用户的期望。
Single Processor Scheduling Algorithms
Batch Systems
First-Come First-Served (FCFS)
Short Job First
Interactive Systems
Round Robin
Priority Scheduling
Multi-level Queue & Multi-level Feedback Queue
Shortest Process Next
Guaranteed Scheduling
Lottery Scheduling
Fair Sharing Scheduling
批处理系统中的调度算法
First-Come, First-Served(FCFS先来先服务)
非抢占式,用于批处理系统。
实现:FIFO队列
- 一个新进程进入队列的尾部。
- 未阻塞的进程在队列末尾重新进入
- 调度器从队列的头部进行选择。
性能指标:平均等待时间(等待时间:进程在就绪队列中的总时间)
计算:
优点:容易实现
缺点:不是最佳调度,发生Convoy effect(短作业等长作业)
Shortest Job First (SJF) 最短作业优先
作业长度相同的情况就FCFS
要求和问题:要提前知道进程使用时间
存在非抢占式和抢占式两个版本
非抢占式版本(进程同时可用):
抢占式版本:Shortest Remaining Time Next(SRTN或者SRTF) 最短剩余时间优先 进程异步就绪
优点:
- 无抢占同时到达情况是最小化平均等待时间的最佳选择。
- 在长作业之前移动较短的作业会改善短作业的等待时间,而不是损害长作业的等待时间。
- 帮助保持输入/输出设备繁忙。 缺点:
- 不实用:无法预测未来的CPU突发时间。
- 操作系统解决方案:使用过去的行为来预测未来的行为。
- 饥饿:可能永远不会安排长时间的作业
交互式系统的调度算法
- 通常抢占式
- 时间被分为量子quantum(时间间隔)。
- 调度决策也在每个量子开始时做出。
- 性能标准
- 最小响应时间
- 最佳比例 Best proportionality
- 代表性算法
- 轮转调度 Round-robin Scheduling
- 优先级调度 Priority Scheduling
- 多级队列和多级反馈队列
- 最短进程优先
- 保证调度
- 彩票调度
- 公平共享调度
轮转调度 Round-robin Scheduling
实现:
- 每个进程获得一个小的CPU时间单位(时间量或时间片),通常为10-100毫秒。
- 允许进程运行直到时间片周期过期,然后发生时钟中断,运行的进程被置于就绪队列中。
- 如果进程在量子过去之前已阻塞或完成,则CPU切换完成。 特点:
- 保证不会挨饿。
- 相当于抢占式的FCFS。
- 就绪队列被视为循环队列。
- 超过时间片的进程返回到就绪队列的末尾
对于时间量子(时间片)的大小:
- 时间量太大
- 如果量子大小足够大,可以在单个量子内完成大多数进程
- 低上下文切换开销。
- 如果量子尺寸太大,退化为FCFS,响应时间差。
- 时间量太小
- 上下文切换太多(开销)
- 上下文切换时间=0.1-1ms
- CPU利用率低。
优点:
- 在作业之间公平分配CPU,无饥饿。
- 作业长度变化时,平均等待时间较短。
- 最短的作业完成得相对较快。
- 周转时间通常大于SRTF,但响应时间更好。 缺点
- 平均等待时间差,作业长度相似
- 性能取决于时间片的长度。
- 如果时间片太短,频繁上下文切换的开销大。
- 如果时间片过长,则退化为FCFS。
- 没考虑优先级。
优先级调度 Priority Scheduling
优先级相同时,FCFS
优先级设置两种方法
- 静态(对于具有已知和常规应用程序行为的系统)
- 具有静态优先级的流程在整个流程生命周期中保持该优先级。
- 动态
- 具有动态优先级的进程将在其执行过程中由调度程序更改该优先级。
- 静态优先级和动态优先级可以共存。
优点:
- 提供一个良好的机制,可以精确定义每个流程的相对重要性。 缺点:
- 低优先级工作可能会导致饥饿。
- 可以通过老化过程来避免:当它们在系统中花费时间时,增加优先级。
- 可能不会给出最好的AWT。
多级队列 Multi-Level Queue
优先级调度的扩展
- 用于根据进程类型、CPU时间、IO访问、内存大小等属性将进程划分为多个队列
- 将就绪队列拆分为多个队列,将进程永久分配给一个队列。
问题:需要事先将进程分配给最合适的优先级队列。
多级反馈队列 Multi-Level Feedback Queue
- 进程在队列之间移动。
- 启动高优先级队列中的每个进程;当它完成每个CPU burst时(用完给定时间片),将其移动到优先级较低的队列。
- 反馈=利用过去预测未来-青睐过去没有太多使用CPU的作业-接近SRTN
- 每个队列表示CPU使用率相似的作业。
- 给定队列中的作业使用给定的时间片执行。
例子:计算使用多级反馈队列时的平均周转时间,如下所示。注意,前2个队列的优先级基于到达时间。
优势
- 适合根据CPU burst需求划分进程。
- 让I/O绑定的进程经常运行。
- 为CPU绑定的进程提供更长的CPU块。 缺点
- 优先级由系统控制。一个进程常常因为它使用了大量的I/O,被认为很重要,
- 行为更改可能计划不当的进程
最短进程优先 Shortest Process Next
类似于批处理系统的最短作业优先SJF
- 优点:完成时间最短,非抢占式
- 缺点:但依赖于对进程完成时间的估计,而且响应时间慢
保证调度 Guaranteed Scheduling (QoS)
计算实际消耗的CPU时间与有权使用的CPU时间的比率(自创建以来的时间除以n),选择比率最低的一个,当正在运行的进程的比率超过其“目标比率”时,切换到另一个进程。
如下图中,实际消耗的CPU时间为3,3,2,有权使用的CPU时间比率7/3,,比率最低的为
彩票调度 Lottery Scheduling
基于概率,优先级高获得的“彩票”多,平均CPU时间与票证数量成比例
优势 易于理解的 高度响应 可以支持流程之间的合作。 易于支持优先级和比例要求。
缺点 困难在于确定票证分配,尤其是在进程来去去受阻的环境中。 对于通用调度来说,这不是一个有用的算法,但对于具有长时间运行的进程的环境更有用,这些进程可能需要分配CPU的共享,例如在服务器上运行多个虚拟机。
公平分享调度 Fair-Share Scheduling
这是基于用户的公平,不是基于内存(轮转调度)的