背景
- CPU调度:从就绪队列里选择一个进程 / 线程作为CPU将要运行的下一个进程 / 线程
- 调度程序:挑选下一个进程 / 线程的内核函数(通过某种调度策略)
- 什么时候调度:主要是进程 / 线程里与运行态相关的状态切换时
- 内核运行调度程序的条件
- 一个进程从运行态切换为等待状态
- 一个进程结束
- 调度情况
- 不可抢占
- 用户级不可抢占:早期的系统不允许用户态层面上的进程调度,所以一个进程阻塞时,其他进程不得不继续等待该进程
- 内核级不可抢占:指一个进程虽然进行了系统调用,但不需要进入等待状态而继续运行时,该进程不会被切换到其他进程
- 可以抢占
- 调度程序在中断被响应后执行
- 当前进程从运行 / 阻塞切换为就绪状态
- 当前运行的进程可以被换出
- 不可抢占
调度准则
-
评价指标
- CPU利用率:CPU处于繁忙时间的百分比
- 吞吐量(throughput):单位时间内完成的进程数量 ⇒ OS计算带宽
- 等待时间(waiting time):进程在就绪队列中的总时间
- 周转时间(turnover time):一个进程从初始化到结束所花费的总时间,包括所有等待时间所花的时间
- 响应时间(response time):一个请求从发起到第一次响应所花费的时间 ⇒ OS计算延迟
-
需求
-
减少响应时间:及时处理用户的输入,并尽快返回输出
-
减少等待时间:减少每个进程等待时间(希望程序一启动就能执行)
-
减少平均响应时间的波动:在交互系统中,可预测性比高差异低平均更重要
-
增大吞吐量(比如传文件,希望一下就能传完了)
-
-
公平:保证每个进程等待相同的时间
调度算法
-
FCFS (First Come, First Served,先来先服务)
- 若进程在执行中阻塞,队列中下一个先得到服务
- 优点
- 简单
- 缺点
- 平均周转时间波动较大
- 当花费时间少的任务排在花费时间长的任务后面时,会导致时间少的进程等待较久
- CPU密集型进程导致I/O闲置时,I/O密集型进程也在等待
-
SPN(SJF)或 SRT
-
SPN (Shortest Process Next) 等价于SJF(Shortest Job First)
-
预测完成时间短的任务先入队
-
优点
- 平均等待时间最短
-
缺点
- 连续的短任务流会使长任务处于饥饿状态(一直得不到执行),不公平
- 需要预知进程的持续时间 ⇒ 可通过统计前面一段时间的CPU使用情况通过公式估计(不精确)
-
SRT: Shortest Remaining Time
- 对于可抢占系统,预测剩余完成时间短的任务先入队(正在运行中的程序只考虑剩余完成时间)
-
-
HRRN (Highest Response Ratio Next,最高响应比优先)
- 响应比R = (w + s) / s = 1 + w / s (w: 等待时间,s: 执行时间)
- 对SPN的改进,将进程等待时间纳入考虑,避免无限期推迟
- 不可抢占
- 缺点:需要预知进程持续时间
-
Round Robin(轮循):使用时间切片和抢占来轮流执行任务
- 不同的进程依次执行一定的时间
- 优点:公平
- 需要额外的上下文切换时间开销
- 时间片(量子)的安排:
- 时间片太大:①等待时间过长;②极限情况退化成FCFS
- 时间片太小:反应迅速,但是吞吐量由于频繁的上下文切换而受到影响
- 目标:①寻找合适的时间片;②经验规则:上下文切换时间维持在1%以内
- 不同的进程依次执行一定的时间
-
Multilevel Feedback Queues(多级反馈队列):优先级队列中的轮循
-
多级队列
- 将就绪队列划分成多个独立的队列,e.g. 前台(交互,要求响应快)和后台(批处理,要求吞吐量)
- 每个队列拥有自己的调度策略,e.g. 前台→RR或SPN,后台→FCFS
- 调度在队列间进行
- 固定优先级:①先处理前台,然后处理后台;②可能导致饥饿
- 时间切片:每个队列得到一个确定的能够调度其进程的CPU时间,如80%给使用RR的前台,20%给使用FCFS的后台
-
多级反馈队列
- 进程在不同优先级的队列中移动,优先级越高的队列,时间片越小,响应速度越快
- 进程的优先级根据进程的特征而改变。IO密集型任务(交互)等待时间越长,优先级越高;CPU密集型优先级降低
-
-
Fair Share Scheduling(公平共享调度) → 控制用户对系统资源的访问
- 需求:多用户共享计算机时,有的用户进程多,有的用户进程少,如何实现用户层面上的公平?
- 一些用户组比其他用户组更重要
- 保证不重要的组无法垄断资源
- 未使用的资源按照每个组的资源分配比例进行分配
- 未达到资源使用率目标的组获得更高优先级
- 实现方法:
- 确定性建模:确定一个工作量,然后计算每个算法的表现
- 建立队列模型:通过概率论的方法处理随机工作负载
- 实现/模拟:建立一个运行实际数据的系统(最灵活,具有一般性)
- 需求:多用户共享计算机时,有的用户进程多,有的用户进程少,如何实现用户层面上的公平?
实时调度
-
实时系统:正确性依赖于时间和功能两方面要求的OS,要求在一定时间内完成某项任务。
- 主要用于工业、火车及工厂嵌入式系统等
-
性能指标
- 时间约束的及时性(deadline)
- 速度和平均性能相对不重要
-
主要特性:时间约束的可预测性
-
分类
- 强(硬)实时系统:需要在保证的时间内完成重要的任务,必须完成,否则会造成严重的后果
- 弱(软)实时系统:要求重要的任务优先级更高,尽量完成,并非必须
-
组成
- 以任务作为一个进程的工作单元
- Released ⇒ 进程进入就绪队列,Execution time ⇒ 进程运行的时间,Relative deadline ⇒ 这个任务相对的时限,Absolute deadline ⇒ 最后的时限
-
参数
-
时限
- 硬时限
- 如果错过最后期限,可能会造成非常严重的后果
- 必须验证在最坏的情况下也能满足时限,保证确定性
- 软时限
- 理想情况下,时限应被最大满足。如果无法满足,则降低时限要求
- 尽最大努力保证
- 硬时限
-
调度算法:决定实时任务执行顺序
- 分类
- 静态优先级调度:执行顺序提前确定
- 动态优先级调度:随执行过程动态调整
- RM(Rate Monotonic)速率单调调度
- 最佳静态优先级调度
- 通过周期安排优先级。周期越短,优先级越高,优先执行周期短的任务
- EDF(Earliest Deadline First)最早期限调度
- 最佳动态优先级调度
- Deadline越早,优先级越高,优先执行Deadline早的任务
- 分类
多处理器调度
- 多个相同的单处理器组成一个多处理器
- 优点:负载共享
- 目标:负载均衡
- 每个处理器运行自己的调度程序,但同时需要考虑多个处理器之间的调度
优先级反转
- 含义:高优先级进程由于环境限制,被迫等待低优先级进程执行的现象(可以发生在任何基于优先级的可抢占的调度机制中)。e.g. 高优先级进程需要访问的资源被低优先级的进程占用(lock)
- 解决办法
- 低优先级进程继承高优先级进程的优先级:高优先级进程访问被占用的资源时,将占用资源的低优先级进程的优先级进程提高到和自己相同的优先级,保证低优先级能够执行完毕
- 优先级天花板