操作系统(八)CPU调度 短剩余时间 吞吐量 轮循 实时调度 多处理器调度 (清华 向勇 陈渝版)

8-1 算法背景 
上下文切换:切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文 
CPU调度:从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个线程/进程 

调度程序:挑选进程/线程的内核函数(通过一切调度策略)使得效率最高,满足用户需求

在进程/线程的生命周期中的什么时候进行调度? 
从一个状态变为另一个状态,特别是和运行(running)相关的状态。 
内核运行调度程序的条件:进程从运行状态切换到等待状态or终结了(done) 
Non-preemptive transaction 
不可抢占调度,调度必须等待事件/进程结束,早期OS。 

现在多为可以抢占的进程,OS决定在何时打断进程,调度程序在中断被响应后执行,当前进程从运行切换到就绪,或者一个进程从等待切换到就绪,可以被换出

针对的是用户态的进程。 
进程在内核中通过系统调用执行,因为系统调用返回时是到发起这个调用的进程继续执行,所以内核中不会切换,抢占。只要进程在系统调用时不存在从运行态到阻塞态的变化,OS可以确保返回正常。 

如果在内核中也允许这种抢占,系统调用返回时不是原来的进程而是另一个优先级更高的进程,就是内核中的抢占。

早期是完全不可抢占,后来用户态进程允许抢占,现在内核态进程也可以抢占。

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

为什么要有用户态和内核态

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态

用户态与内核态的切换

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工作流程如下:

  1. 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
  2. 用户态程序执行陷阱指令
  3. CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
  4. 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
  5. 系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

8-2 调度原则 


CPU的占用率是波状,CPU大量运算是高峰,而读写I/O时是平稳的低值。每个调度决定都是关于下一个CPU突发时将哪个工作交给CPU,在时间分片下,线程可能在结束当前CPU突发前被迫放弃CPU。 

程序在CPU突发和I/O中交替,CPU占用率高说明是在充分地使用CPU。

选择调度方法的评价指标: 
CPU使用率:CPU处于忙状态的时间百分比 
吞吐量:单位时间内完成的进程数量 
周转时间:一个进程从初始化到结束包括(所有等待时间)所花费的时间,周转时间=等待时间+服务时间 
等待时间:进程在就绪队列中的总时间,进程从就绪态到运行态的时间。 

响应时间:一个请求被提交到第一次响应所花费的总时间

NEED SPEED FOREVER“更快” 
高带宽:吞吐量高 

低延迟:响应时间快

用量化的方法来看调度算法:

  • 减少响应时间
  • 减少平均响应时间的波动,交互系统中,可预测性比高差异低平均更重要
  • 增加吞吐量 
    减少开销(操作系统开销,上下文切换) 
    系统资源的高效利用(CPU,I/O设备)

  • 减少等待时间

难以每个都做到,只能取平衡。不同需求。 

桌面系统要求交互,用低延迟调度增加了交互式表现,但数据中心的 服务器更强调吞吐量,OS要保持吞吐量不受影响,吞吐量是OS的计算带宽,延迟时间是OS的计算延迟。

要公平 

每个进程都公平地得到CPU的支持,比如占用相同的CPU时间,或等待相同时间。但是,公平通常会增加平均响应时间。

8-3 调度算法

  • 一般性的调度算法
  • 针对嵌入式系统的特殊调度算法
  • 多CPU多内核的调度算法

常用简单调度算法 
FCFS first come first served先来先服务 

如果前面的进程运行的时间长,后面的进程就只能等着,导致周转时间慢。如果进程阻塞了,队列中的下一个会得到CPU 


优点:简单 

缺点:平均等待时间波动大,花费时间少的可能反而排在后面,可能导致CPU和I/O之间的重叠处理,没考虑抢占,CPU密集的进程导致I/O闲置时,I/O密集型进程也在等。 

SPN/SJF/SRT shortest process next/shortest JOB first/shortest remaining time 短剩余时间,短进程优先


不可抢占:SJF SPN 
可抢占:ready queue中的第一个进程正在运行时,来了一个比它的预测完成时间还短的进程,SRT 
优点:最小的平均等待时间和周转时间 

缺点:可能导致长任务饥饿,不能保证公平;需要预知未来下一个进程的时间,比如询问用户,如果用户欺骗就杀死进程。 

根据执行历史看将来CPU突发的持续时间,递归展开




会有差距,趋势一致

HRRN 最高相应比优先 priority=(waiting time +estimated running time)/estimated running time 取HIGHER值 
SPN只考虑了执行时间,SERVICE TIME,它还考虑了等待时间。 
不可抢占,防止无限期延迟即进程饥饿 
交互性,响应性更好

缺点:对抢占性的支持不够,也需要预知service time

Round Robin 轮循,用时间切片和抢占来轮流执行,强调了公平 
在量子切片/时间切片的离散单元中分配处理器,时间片结束时切换到下一个准备好的进程 

process execute every (n-1)q time units




公平,相对稳定;但平均等待时间较长

开销: 
额外的上下文切换; 
时间量子的选择,太大则等待时间过长会退化成FCFS太小反应迅速但吞吐量由于大量的上下文切换开销受影响 

选择一个合适的时间量子,经验是维持上下文切换开销处于1%以内,现在LINUX是千分之一秒


Multilevel Queues–→ multilevel Feedback Queues 
多级队列: 
就绪队列分为相对独立的队列,前台交互,RR,后台/底层批处理,FCFS,调度在队列间进行

  • 固定优先级:先前台,再处理后台,可能导致饥饿
  • 时间切片:每个队列都得到一个确定的,调度其进程的CPU总时间,如80%给前台,20%给后台
进程和队列都在动态变化,能否动态调整? 
多级反馈队列 优先级队列中的轮循 有动态调整: 
一个进程可以在不同队列中移动,N级优先级 
在所有队列中优先级调度,每个级别内部RR轮循 

时间量子大小随优先级增加而增加,若当前时间量子中没有完成就给当前任务则降到下一个优先级


一个进程,先是I/O密集型,提到高优先级,然后变为CPU密集型,就随着不断消耗时间量子就下降到低的优先级,保证I/O密集型任务停留在高优先级 
等待时间越长,优先级越高,服务时间越长优先级越低 

能动态地根据进程的特征调整队列和调度

Fair share scheduling cpu的等待时间和执行时间公平共享 
在用户级别实现公平共享 

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

评价调度方法:

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

最好还是在真实机器上跑一遍,因为和硬件也有关系

8-4 实时调度(real-time) 
调度火车,工厂,需要确保任务在规定时间内完成的 
实时调度定义:正确性依赖于其时间和功能两方面的一种OS 
性能指标:时间约束的及时性(deadlines),速度和平均性能相对不重要,重点是时间约束的可预测性。 

及时性 可预测性

类别 
硬实时系统/强实时系统:如果某个任务没完成有严重后果 
软实时系统/弱实时系统:重要的进程优先级更高,要尽量完成,如看视频,帧数没控制好会掉帧。

任务/工作单元job:一次计算,一次文件读取,一次信息传递等等 

属性:取得进展所需要的资源和实时参数 


release time 进程处于就绪态的时间 
relative deadline: 任务是间隔时间段完成,每个任务有个特定的时间,要在特定的时间段内完成 
absolute deadline:最终的结束时间

周期任务,有规律的重复

周期P=inter-realease time=relative deadline (0 < p) 
执行时间e,最大执行时间< p 
使用率/利用率U=e/p

hard real-time—hard deadline:保证确定性 

soft real-time—-soft deadline

设计算法满足deadline要求,静态优先级调度(事先确定),动态优先级调度(优先级会动态变化)

RM rate monotonic 速率单调调度 
静态最佳,根据周期安排优先级,越短优先级越高 
EDF earliest deadline first 最早期限调度 

最佳静态,deadline越早优先级越高,动态调整优先级

8-6 多处理器调度 
要考虑:1,任务来了,放在哪个CPU上执行?2,怎么考虑公平性?load balance负载平衡 
多处理器的CPU调度更加复杂,多个相同的单处理器组成一个多处理器,优点是负载共享。对称多处理器(SMP),每个处理器运行自己的调度程序,需要在调度程序中同步

8-7 优先级反转 
可发生在任何基于优先级的可抢占的调度机制中,当高优先级任务要等待低优先级任务时发生 

优先级反转的持续时间取决于其他不相关任务的不可预测的行为 



T3先执行,到t2时访问共享资源,t3时T1抢占,开始执行T1,某时刻需要访问已经被T3占用的共享资源,但T3还没有释放,所以不能继续T1开始等待,t5时T2又抢占执行,此时T1受制于T2的执行时间,因为T1必须要等T3,导致T1的时间延长了,引起不稳定状态,系统重启。 
优先级反转的解决方法: 

优先级继承:如果有共享资源,低优先级任务继承等待它所占的资源的最高优先级任务的优先级,当阻塞发生时资源的拥有者的优先级会自动提升,使中间优先级的不能抢占。



T3的优先级继承了T1的优先级

另一种方式:priority ceilings 
优先级天花板:资源的优先级=所有可以锁定该资源的任务中优先级最高的那个任务的优先级。事先统计。一旦某任务占用该资源,则优先级提升为资源的优先级。不论阻塞是否发生。 
除非优先级高于系统中所有被锁定的资源的优先级上限,否则任务在尝试执行临界区的时候会被阻塞。 
持有最高优先级上限信号量锁的任务,会继承被该锁阻塞的任务的优先级

补充: 
信号量,S,整数,S大于等于0-→S=可供并发进程使用的资源实体数,S<0-→S=正在等待使用临界区的进程数

互斥量mutex:二元信号灯,提供对资源的独占访问,有0和1两个值,0为锁定,当前对象被锁定,用户如果试图lock临界资源则排队等待,1是空闲,进程可以lock资源,之后1—>0

同一个线程中,为了防止死锁,系统不允许连续两次对mutex加锁。即加锁和解锁需要在同一个线程中完成。

优先级反转:如果任务之间由于有了共享资源出现了竞争或死锁,会引起OS不安全,采用信号量方法对其进行操作系统的优先级反转。 
一个任务要用一个共享资源,必须先申请得到这个信号量,高优先级的即使ready但因为得不到S,不能使用该资源。










  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值