系列文章
第二章 进程管理 -调度
2.7 调度的类型
- 长程调度:决定哪个程序能进入系统成为进程,是创建进程的部分,用时最长
- 中程调度:决定哪个进程能进入内存,是换入进程的部分,用时中等
- 短程调度:决定哪个进程下次运行,是就绪转换为运行的部分,用时最短
执行频繁程度:短程调度>中程调度>长程调度
cpu密集型进程:主要执行计算工作,偶尔用到I/O设备
I/O密集型进程:执行时间主要取决于I/O操作的时间
调度的目的:满足系统目标(性能),把进程分配到一个或多个cpu上去
2.7.1 长程调度
- 控制哪个程序能进来,即控制了并发度(进程密度)
- 决策参考因素:FCFS、priority、ddl、I/O需求
2.7.2 中程调度
- 决定哪些进程换入,哪些换出
- 中程调度是交换功能的一部分
- 换入取决于系统并发度要求和换出进程的存储需求
2.7.3 短程调度(分派程序)
- 决定哪个进程先得到cpu
- 当前进程阻塞或抢占发生时,调用短程调度
2.8 短程调度的规则
性能指标
- 响应时间:用户提出请求到接收响应的时间=输入传送t+处理t+响应传送t
- 截止时间:任务必须开始的时间或DDL
- 系统吞吐量:单位时间完成进程数
- cpu使用率:cpu忙状态占比
- 周转时间(驻留时间):进程提交到完成的时间=等待资源t+处理t(计算:完成时刻-提交时刻)
- 平均周转时间:平均的周转时间
- 带权周转时间(归一化周转时间):周转时间/系统真正为进程提供服务的时间
- 平均带权周转时间:平均的带权周转时间
上面的性能指标按面向用户和面向系统分为:
面向用户:响应时间、周转时间等、截止时间
面向系统:吞吐量、cpu利用率
非性能指标
- 可预测性
- 公平性(无饥饿)
- 强制优先级
- 平衡资源
面向用户的指标在任何系统都很重要,面向系统的指标在单用户系统不重要,这些规则不能同时达到最优
2.9 调度的决策模式
分为两类
- 抢占:当前进程可被OS中途停止,转而执行另一个进程
- 非抢占:进程只会被自己阻塞
抢占的时机
- 新进程到达时
- 中断后把一个阻塞态置为就绪态
- 时钟中断
调度的选择函数
决定下一个进程是谁
三个参数:
- w 到目前为止的等待时间
- e 到目前为止的等待时间
- s 进程所需总服务时间,s>=e,且需估计或由用户提供
2.10 调度算法(重点)
饥饿的理解
轮到该进程使用CPU时,另一个进程以某种原因抢先占用CPU(抢占)
几个人一起吃一块蛋糕,轮到你吃时,你后边的人抢到你前面吃掉了你的那一份,没吃到原本该你吃的东西,你会很饥饿
非抢占
FCFS、SPN、HRRN
抢占
RR、SRT、Feedback
开销小
FCFS、RR
有饥饿
SPN、SRT、Feedback
2.10.1 FCFS先来先服务
- 按照请求cpu顺序执行
- 对短进程不利,参考超市购物
- 对I/O密集型不利,因为cpu需求小
- 属于非抢占,无饥饿,响应时间可能很长
- 早晨食堂排队买早餐就是先来先服务
2.10.2 RR时间片轮转调度算法RoundRobin
-
在FCFS中加入加入时钟中断
-
在分时系统或事务处理系统中特别有效
-
属于抢占,无饥饿算法,性能与时间片设置密切
- 时间片长:对长作业有利
- 时间片短:对短作业有利
-
对I/O密集型不利:I/O密集型进程每次短暂使用CPU后,都会再加入队列尾进行调度,而cpu密集型则可以占用cpu更长时间,I/O密集型进程所用时间大于预期时间。
- 你早餐去食堂排队买两个鸡蛋(短作业),到你的时候买了一个鸡蛋饭卡没钱了(I/O中断),你只能去充卡,卡充好后(I/O满足),你再回来排队,只能从队尾排起
-
改进的算法:URR
-
新增I/O阻塞完成的进程队列队列,该队列优先级高于就绪队列,比RR更公平
- 你早餐去食堂排队买两个鸡蛋(短作业),到你的时候买了一个鸡蛋饭卡没钱了(I/O中断),你只能去充卡,卡充好后(I/O满足),你再回来排队,可以只排因为充卡中断买鸡蛋的人排成的队,而不用去排没买过饭的人排成的队
-
早晨食堂排队买早餐的基础上,增加一个时间限制,你30秒之内买不完饭就要重新排队…
2.10.3 短作业优先SJF/SPN/SPF
- 该算法照顾短作业,所以必须事先知道谁“短”,所以该算法前提为所有进程执行时间已知
- 属于非抢占、有饥饿算法
- 减少了平均周转时间,因为非抢占,不适用于分时、事务处理系统
- 用户估计不准时不能做到SJF
- 早晨食堂排队买早饭,谁买东西快谁先买,但一个人正在买的时候另一个人不能插队
2.10.4 剩余时间最短者优先算法SRT
- 选择预期剩余时间最短的进程,是在短作业优先的基础上增加了抢占机制
- 属于抢占、有饥饿算法
- 该进程必须记录进程已执行时间
- 在平均周转时间上优于短作业优先,也需要预估进程执行时间
- 早晨食堂排队买早饭,谁买东西快谁先买,如果小张还有1分钟才能买完,这时候来了一个还差59秒就能买完的人,新来的人就能插到小张前面买
2.10.5 HRRN 最高响应比优先算法
-
当前进程执行完成时,下一个选用响应比最高的进程
-
属于非抢占,有饥饿算法
-
响应比=(waitTime+serveTime)/serveTime=1+waitTime/serveTime
-
你去食堂是为了买早饭,你到食堂的排队时间+买饭时间再除以买饭时间就是响应比,这个值越大,你买早饭的效率就越低
-
短作业serveTime小,waitTime/serveTime更大,响应比更大,优先调度
-
长作业等待时间长了之后,waitTime/serveTime增大,响应比变大,优先调度
-
该算法是一种动态优先级调整算法,结合了FCFS和SJF
-
该算法既照顾了短进程,又不让长进程长时间饥饿
-
该进程需要进行响应比计算,需要预估执行时间
-
去食堂排队买早饭,小张急着上课,买东西快,或者小李买的慢,但是被插队了好几次,阿姨为了不让大家生气,允许他俩插队打饭
2.10.6 FeedBack 反馈调度算法
-
该算法的思路是惩罚长进程,而像SJF、SRT、HRRN是给短进程优惠
-
属于抢占、有饥饿算法
-
设置多个优先级队列区别对待,各个队列中时间片可以不一样长,优先级高的队列时间片短
-
新来的进程位于最高级优先级队列尾
-
先执行优先级高队列中的进程,进程时间片用完还没执行完就会降级到优先级更低的队列尾
-
一般优先级为i的队列时间片为2^i
-
能够较好的满足各种类型用户需求
-
终端型用户、短作业用户:交互作业常为短作业、在比较高的优先级队列就能执行完
-
长进程用户:进程随着队列下降,分配的时间片足够执行完
-
去食堂排队买早饭,有好几个窗口,但只有一个打饭阿姨,阿姨让大家排成一个队,轮流来第一个窗口打饭,在10秒内没打完饭的人去第二个窗口排队,等第一个窗口没人了,阿姨来第二个窗口帮大家打饭,20秒内没打完的人再去第三个窗口排队,第三个窗口可能时间限制是40秒,第四个第五个以此类推,要是这时候又来了一个人打饭,阿姨要回到第一个窗口在10秒内帮他打饭,打不完这个人也要挨个去更长时间的窗口排队
2.11 实时系统与实时调度
一些概念
计算结果存在时效性,过期无意义,如新闻
- 实时系统:系统可及时(即使)响应外部请求,在规定时间内完成对该事件的处理,并控制所有实时任务协调一致运行
- 实时任务:具有及时性要求,常常重复执行的特定进程
- 开始截止时间:到点必须开始
- 完成截止时间:deadline
2.11.1 实时任务分类
- 按有无截止时间
- 硬实时:必须满足截止时间,否则产生破环性影响(截止日期前交期末论文)
- 软实时:不强制要求,超时仍有意义(打算晚上十一点前睡觉,虽然十一点没睡着,但是比平常睡得早)
- 按有无周期
- 非周期性任务:有总的ddl,(3点开始写寒假作业,6点前写完)
- 周期性任务:有周期性ddl, (3点开始写寒假作业,4点前写完语文部分,5点前写完数学部分,6点前写完英语部分)
2.11.2 实时OS特点
- 可确定性:可按约定的固定时间段执行操作
- 可响应性:关注为中断提供服务的时间
- 用户控制:由用户区分软硬实时、设定优先级
- 可靠性:实时响应
- 失效弱化:不能满足所有进程的实时性时,优先满足优先级高的任务的实时性要求,减小损失
2.11.3 实时调度
- 静态表调度:输入周期性到达时间、执行时间、周期性的最后结束期限和每个任务的相对优先级,输出调度表,用于调度实时任务
- 用于调度周期性实时任务
- EDF(最早截止时间优先)算法属于此类调度
- 不灵活,任何变动都会引起调度表的修改
- 有好几门期末考试,你安排了个日程表来复习,但是有几个考试改了时间,你之前的日程表也要修改
- 静态优先级抢占调度:根据优先级抢占
- 用于调度非实时多道程序系统
- 一般根据任务的截止时间制定优先级
- 复习的时候,想先复习比较重要的科目,再复习不太重要的科目
- 动态规划调度(动态表调度):为新到达的实时任务和当前任务动态创建调度表
- 在当前任务不会超时的条件下,若新任务也能完成,则执行新任务
- 复习的时候,每新公布一门考试的时间,你就将它加到复习计划里面
- 动态尽力调度
- 为新到达的任务依据属性赋予优先级,优先级高的先调度
- 尽最大努力优先调度最高级的任务
- 缺点:不知道能不能满足约束时间,有可能会使得原来不会超时的任务也超时
- 实现简单,用于非周期性实时任务
- 复习的时候,还有三天考高数,本来能复习完,突然宣布高数前一天考大物,只好先去复习大物,结果可能两个都没复习完
抢占方式
- 时间片轮转
- 响应时间:秒级
- 时间片执行完由FCFS下一个进程抢占
- 广泛用于分时系统及一般不严格的实时处理系统
- 优先级非抢占
- 响应时间:百毫秒~秒级
- 实时进程优先级更高,优先执行,当前进程完成或阻塞时调度下一个
- 多用于多道批处理系统及不太严格的实时系统
- 优先级抢占
- 响应时间:数毫秒~数十毫秒
- 优先级+时钟中断:实时进程在进程时钟中断点或进程阻塞时根据优先级抢占
- 用于一般实时系统
- 立即抢占
- 响应时间:微秒~毫秒级
- 按照优先级直接抢占
- 用于苛刻的实时系统
2.11.4 实时调度示例
实时任务调度的参考信息
- 就绪时间
- 开始截止时间
- 完成截止时间
- 执行所需时间
- 资源需求
- 优先级
- 子任务结构:必须执行的部分(硬实时部分)和可选执行的部分
调度思路
- 决定调度算法:根据DDL决定优先级,谁最早截止先处理谁(EDF)
- 决定抢占方式
- 开始截止时间明确:采取非抢占方式(当前进程到点就阻塞,开始调度临期的进程,临期进程就不会超时)
- 完成截止时间明确:采取抢占方式(根据截止时间判断什么时候抢占)
如:对于完成截止时间明确的周期性实时任务
- 周期性任务->静态调度表->EDF算法
- 完成截止时间明确->抢占方式
对于开始截止时间明确的非周期性实时任务
- 非周期性->允许CPU空闲的EDF算法
- 优先调度截止时间最早的任务,并让其运行完
- CPU利用率不高,但可以保证系统任务都完成
速率单调调度算法 RMS
- 任务速率:任务周期(秒)的倒数,单位为赫兹
- 优先级确定
- 任务周期越短,任务速率越高,优先级越高
- 即优先级函数是任务速率的单调递增函数
实时系统处理能力限制
即实时任务系统处理要满足的条件:
系统中各个任务的处理器利用率总和不能超过1
2.11.5 优先级反转
- 即低优先级抢占高优先级的情况,曾发生在美国国家航空航天局的火星探路者上
- 可发生于任何基于优先级的可抢占的调度方案中
- 解决:优先级继承:优先级较低的任务继承任何与其共享同一资源的优先级较高的任务的优先级