OS操作系统系列文章目录
【OS操作系统】Operating System 第一章:操作系统的概述
【OS操作系统】Operating System 第二章:启动、中断、异常和系统调用
【OS操作系统】Operating System 第三章:连续内存分配
【OS操作系统】Operating System 第四章:非连续内容分配
【OS操作系统】Operating System 第五章:虚存技术
【OS操作系统】Operating System 第六章:页面置换算法
【OS操作系统】Operating System 第七章:进程与线程
【OS操作系统】Operating System 第八章:处理机调度
【OS操作系统】Operating System 第九章:同步互斥问题
【OS操作系统】Operating System 第十章:信号量与管程
【OS操作系统】Operating System 第十一章:死锁与进程通信
【OS操作系统】Operating System 第十二章:文件系统
目录
第八章:处理机调度
背景
- 上下文切换:
- 切换CPU的当前任务,从一个进程/线程转换到另一个进程/线程;
- 保存当前进程/线程在PCB/TCB中的执行上下文(也就是CPU的状态);
- 切换任务,读取下一个进程/线程的上下文;
- CPU调度:
- 从就绪队列中挑选出一个进程/线程作为CPU将要执行的下一个进程/线程;
- 需要调度程序(挑选进程/线程的内核函数);
- 需要考虑调度的时机;
-
在进程/线程的生命周期中,从一个状态到另一个状态的时候会发生调度;
-
内核运行调度程序的条件(满足其一即可)
- 一个进程从运行状态切换到等待状态;
- 一个进程被终结了;
- CPU的调度方式:
一般指用户态,内核态也可能会涉及到是否抢占
- 不可抢占式:
调度程序必须等待时间结束(效率低,不采用); - 可以抢占式:
- 调度程序在中断被响应后执行;
- 当前的程序从运行切换到就绪,或者一个进程从等待切换到就绪;
- 当前运行的进程可以被换出;
- 不可抢占式:
调度原则
- 程序执行模型:
程序在CPU突发和I/O中交替- 每个调度决定都是关于在下一个CPU突发时,将哪个工作交给CPU;
- 在时间分片机制下,线程可能在结束当前CPU突发前就被迫放弃CPU;
- 调度算法的性能指标
- CPU使用率:
CPU处于忙状态所占时间的百分比; - 吞吐量:
在单位时间内完成的进程数量; - 周转时间:
一个进程从初始化到结束,包括所有等待时间所花费的时间; - 等待时间:
进程在就绪队列中的总时间; - 响应时间:
从一个请求被提交到产生第一次响应所花费的时间;
- CPU使用率:
-
各指标在操作系统中的表现:
- 对“快”的评价指标:
传输文件时的高带宽,玩游戏时的低延迟(这两点相互独立); - 减少响应时间:
及时处理用户的输出,并尽快将输出提高给用户; - 减少平均响应时间的波动:
在交互系统中,可预测性比高差异性、低平均性更重要; - 增加吞吐量:
减少开支(操作系统开支/上下文切换);系统资源的高效利用(CPU,I/O设备); - 减少等待时间:
减少每个进程的等待时间; - 低延迟调度增加了交互式表现:
如果移动鼠标,希望屏幕迅速反馈光标的移动; - 操作系统保证吞吐量不受影响:
若想结束长时间的编程,操作系统必须不时进行调度,即使存在许多交互任务;
- 对“快”的评价指标:
-
吞吐量是操作系统的计算带宽;
-
响应时间是操作系统的计算延迟;
- 公平的目标:
举例:- 保证每个进程占用的相同的CPU时间(但是这并不公平,因为一个用户可能比其它用户运行更多的进程);
- 保证每个进程都有相同的等待时间;
- 公平通常指,增加平均响应时间;
调度算法
- 调度算法:
- FCFS:
先来先服务,first come first served
; - SPN(SJF)SRT:
短进程优先(短作业优先)短剩余时间优先,shortest process next (shortest job first) shortest remaining time
; - HRRN:
最高响应比优先,highest response ratio next
; - Round robin:
轮循,使用时间切片和抢占来轮流执行任务; - Multilevel feedback queues:
多级反馈队列,优先级队列中的轮循; - Fail share scheduling:
公平共享调度;
- FCFS:
FCFS 先来先服务
- FCFS规定,如果进程在执行中阻塞,队列中的下一个进程会得到CPU
- 优点:
简单; - 缺点:
- 平均等待时间波动较大(没有抢占);
- 花费时间少的任务可能排在花费时间长的任务后面;
- 可能会导致IO和CPU之间的重叠处理(CPU密集型进程会导致IO设备闲置时,IO密集型进程也在等待);
SRT 短剩余时间优先
- SPN(SJF)规定下一个最短的进程(短任务优先),即按照预测的完成时间排序将任务入列;
- SRT是针对SPN增加了抢占机制的版本:
如果一个进程较长,在这期间所有进程都要等待,如果将其中断,先执行短的进程,运行效率会有显著的提升; - 优点:
平均周转时间最少; - 缺点:
- 可能会导致饥饿:
- 连续的短任务会使长任务饥饿;
- 短任务可用时的任何长任务的CPU时间都会增加平均等待时间;
- 可能会导致饥饿:
- 需要预测进程的执行时间
- 解决方法:询问用户;
如果用户欺骗就杀死进程; - 或,根据历史事件分配预估未来时间的分配;
- 解决方法:询问用户;
HRRN 最高响应比优先
- 在SPN调度的基础上进行改进,考虑了等待时间,改善饥饿现象;
- 不可抢占式;
- 关注进程等待时间,防止无限期被推迟;
R = (W + S) / S
,选择R值最高的进程执行,其中W
为等待时间,S
是执行时间;
Round robin 轮循
- RR调度使用时间切片和抢占来轮流执行任务,在叫量子(或时间切片)的离散单元中分配处理器;如果时间片结束了,那么就切换到下一个准备好的进程;
- 优点:
公平; - 缺点:
- 额外的上下文切换花销;
- 如果时间量子太大,则等待时间过长,极限情况下退化成FCFS;
- 如果时间量子太小,虽然反映迅速,但是开销大,吞吐量由于大量的上下文切换开销而受到影响;
- 目标:
选择一个合适的时间量子; - 仅验规则:
维持上下文切换开销处于1%以内;
- 实例:
Multilevel feedback queues 多级反馈队列
- 多级队列:
- 为了兼顾搭配多个调度算法的优点,就绪队列可用被划分为多个独立的队列;
且每个队列可以有自己的调度策略;
实例:
分为两个队列,前台队列负责交互的进程,使用RR调度,后台队列是负责批处理的进程,使用FCFS调度; - 需注意的是,调度必须在队列间进行;
实例:
固定优先级:先处理前台进程,后处理后台进程,可能会引发饥饿;
时间切片:每个队列都得到一个确定的能够调度其进程的CPU总时间,如前台占80%,后台20%;
- 为了兼顾搭配多个调度算法的优点,就绪队列可用被划分为多个独立的队列;
- 进程是一个动态的,同一个进程的不同时刻可能适用的调度算法不一样,因此希望进程能够在不同的队列中移动;
- 多级反馈队列:
- 对于IO密集型的任务,即交互较多的进程,放在高优先级队列中,这里的时间切片较短;
- 对于CPU密集型的任务,即占用计算资源的进程,放在低优先级队列中,这里的时间切片较长;
- 实例:
时间切片的大小随着优先级的提升而减少;如果当前的时间切片中,任务没有完成,则会降到下一个优先级中;
Fair share scheduling 公平共享调度
- 站在用户的角度实现公平共享CPU资源;
- 因为有的用户可能开的进程多,有的用户进程少;
- 考虑了以下的情况:
- 一些用户组比其它用户组更重要;
- 保证不重要的组无法垄断资源;
- 未使用的资源按照每个组所分配的资源的比例来分配;
- 没有达到资源使用目标的组获得更高的优先级;
不同调度模型的评价准则
- 确定性建模:
确定一个工作量,然后计算每个调度算法的表现; - 队列模型:
用来处理随机工作负载的数学方法; - 实现/模拟:
建立一个允许算法运行实际数据的系统;最灵活,最具一般性;
各调度算法的比较
- FCFS,先来先服务:
- 不公平,平均等待时间较差;
- SPN、SRT,短剩余时间优先:
- 不公平,但是平均等待时间较小;
- 需要精确预测计算时间;
- 可能会导致饥饿;
- HRRN,最高响应比优先:
- 基于SPN调度的改进;
- 不可抢占式;
- Round robin,轮循:
- 公平,但是平均等待时间较差;
- MLFQ,多级反馈队列:
- 和SPN类似;
- Fair share scheduling,公平共享调度:
- 公平是第一要素;
实时调度
- 实时系统:
- 定义:
正确性依赖于其时间和功能两方面的一作操作系统; - 性能指标:
时间约束的及时性(deadlines);速度和平均性能相对不重要; - 主要特性:
时间约束的可预测性; - 分类:
- 强实时系统:
需要在保证的时间内完成重要的任务,必须完成; - 弱实时系统:
要求重要的进程的优先级更高,尽量完成,本非必须;
- 强实时系统:
- 定义:
- 专业术语
-
任务(工作单元job):
一次计算,一次文件读取,一次信息传递等; -
属性:
取得进程所需资源,定时参数;
-
周期任务:
任务有规律地重复执行; -
周期:
p = inter - release time (0 < p)
;(两个红箭头内) -
执行时间:
E = 最大执行时间 (0 < e < p)
;(蓝色区域) -
使用率:
U = e / p
;
-
硬时限:
- 如果错过了最后期限,可能会发生灾难性或非常严重的后果;
- 必须验证:在最坏的情况下,也能够满足时间;
- 保证确定性;
-
软时限:
- 理想情况下,时限应该被最大满足;
- 如果有时限没有被满足,那么就响应地降低要求;
- 尽最大努力去保证;
-
- 可调度性:
表示一个实时系统是否可以满足deadline
要求,决定实时任务执行的顺序;- 静态优先级调度:
运行之前优先级已经得到确定; - 动态优先级调度:
优先级在运行中是动态变化的;
- 静态优先级调度:
- 实时调度算法:
- RM(Rate Monotonic)速率单调调度:
- 最佳静态优先级调度;
- 通过周期安排优先级;
- 周期越短,优先级越高;
- 先执行周期最短的任务;
- EDF(Earliest Deadline First)最早期限调度:
- 最佳的动态优先级调度;
- Deadline越早,优先级越高;
- 先执行Deadline最早的任务;
- RM(Rate Monotonic)速率单调调度:
多处理器调度与优先级反转
多处理器调度
-
多处理器的CPU调度更复杂:
- 多个相同的单处理器组成一个多处理器;
- 优点:负载共享;
-
对称多处理器(SMP):
- 每个处理器运行自己的调度程序;
- 需要在调度程序中同步;
优先级反转
- 优先级反转可以发生在任何基于优先级的可抢占的调度机制;
当系统内的环境强制使高优先级任务等待低优先级任务时,发生;
- 优先级反转反例:
优先级反转的持续时间取决于其它不相关任务的不可预测的行为,在这种情况下,高优先级可能比低优先级任务晚完成;
假设优先级 T 1 > T 2 > T 3 T_1 > T_2 > T_3 T1>T2>T3,
- 首先时间轴上,只有T3有任务,所以在t1-t3是T3在执行;
- 到t2时刻,T3访问了一个蓝色的共享资源(T1在t4时也会用到);
- 到t3时刻,T1出现,它的优先级较高,所以T3被中断,T1开始执行;
- 直到t4时刻,T1需要使用T3所占用的蓝色共享资源,故先等待共享资源释放后才能继续执行,所以将CPU让给T3;
- t4-t5是T3在执行,到t5时刻,此时T2出现,优先级比T3高,所以T3又被中断,开始执行T2;
- 当T2执行完后,T3在时间t6-t7中释放了蓝色共享资源,T1在能继续执行(继t3时刻到t7时刻,T1才得到执行);
- 故此出现了奇怪的现象,优先级最高的T1,实际上是等T2运行完后才得到了执行;
- 优先级继承:
低优先级任务可以继承高优先级任务的优先级,这个依赖于它们共享的资源;
故此时,T3的优先级会动态地提升,即T2无法抢占T3;
- 优先级天花板:
拥有资源的任务的优先级,和所有可以也拥有该资源的任务中,优先级最高的那个任务的优先级是相同的;
即T3拥有了T1的资源,则T3的优先级会被提升到T1的优先级别;- 除非当前进程的优先级,高于系统中所有拥有该资源的任务的最高优先级,否则任务尝试执行临界区的时候,将会被阻塞;
- 持有最高优先级上限信号量锁的任务,也会继承被该锁所阻塞的任务的优先级;