第3章 处理机调度与死锁
3.1 处理机调度相关基本概念
1、处理机调度:
1)定义:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。
2)作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度:
- 高级调度(High Scheduling)
- 中级调度(Intermediate-Level Scheduling)
- 低级调度(Low Level Scheduling)
①高级调度(High Scheduling)
定义:又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)。
决定外存后备队列中的哪些作业调入内存;为它们创建进程、分配必要的资源。将新创建的进程排在就绪队列上,准备执行。
②中级调度(Intermediate-Level Scheduling)
定义:又称交换调度或中程调度(Medium-Term Scheduling)
引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。
③低级调度(Low Level Scheduling)
定义:也称为进程调度、微观调度或短程调度(Short-Term Scheduling)。
决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。
进程调度方式:
非抢占方式(Non-preemptive Mode)
一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。
抢占方式(Preemptive Mode)
允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。
3)三级调度比较
4)调度队列模型
不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。
- 仅有进程调度的调度队列模型
- 具有高级和低级调度的调度队列模型
- 同时具有三级调度的调度队列模型
5)选择调度方式和调度算法的若干准则
- 面向用户的准则
- 面向系统的准则
3.2 常用调度算法
调度的实质就是一种资源分配。不同的系统和系统目标,通常采用不同的调度算法——适合自己的才是最好的。
1、先来先服务调度算法FCFS(First Come First Service)
一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。
- 按照作业提交,或进程变为就绪状态的先后次序分派CPU;
- 新作业只有当当前作业或进程执行完或阻塞才获得CPU运行
- 被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。 (所以,默认即是非抢占方式)
2. 短作业(进程)优先调度算法SJF/SPF(Shortest Job First) OR (Shortest Process First)
SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。
方式:
- 抢占
- 非抢占
3. 高优先权优先调度算法HPF Highest Priority First
照顾紧迫性作业,使其获得优先处理而引入调度算法。常用于批处理系统中的作业调度算法,以及进程调度算法
分两种方式:
- 非抢占式优先权算法
- 抢占式优先权算法 关键点:新作业产生时
优先权的类型
- 静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。
- 动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。
4.高响应比优先调度算法HRRN (Highest Response Raito Next)
HRRN为每个作业引入动态优先权,使作业的优先级随着等待时间的增加而以速率a提高:
优先权 =(等待时间+要求服务时间)/要求服务时间 = 响应时间 / 要求服务时间
5. 基于时间片的轮转调度算法RR(Round Robin)
分时系统新需求:及时响应用户的请求;采用基于时间片的轮转式进程调度算法。
(1)时间片轮转算法
- 将系统中所有的就绪进程按照FCFS原则,排成一个队列。
- 每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。
- 在一个时间片结束时,发生时钟中断。
- 调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。
(2)多级反馈队列算法FB(Multiple-level Feed Back Queue)
- 设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。
- 赋予各队列进程执行时间片大小不同, 优先权越高,时间片越短。
各算法综合比较
3.3 实时调度
什么是实时系统?
- 指系统能够在限定的响应时间内提供所需水平的服务。
- 指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。
1. 实现实时调度的基本条件
1)提供必要的信息
- 就绪时间。该任务成为就绪状态的时间。
- 开始截止时间、完成截止时间。
- 处理时间。从开始执行到完成所需时间。
- 资源要求。任务执行时所需的一组资源。
- 优先级。根据任务性质赋予不同优先级。
2)系统处理能力足够强
系统中有M个周期性的硬实时任务,处理时间为Ci,周期时间表示为Pi,单机系统中必须满足条件
3)采用抢占式调度机制
4)具有快速切换机制
2. 实时调度算法的分类
根据实时任务的性质
硬实时调度算法
软实时调度算法;
按调度方式
非抢占调度算法
抢占调度算法;
根据调度时间不同
静态调度算法
动态调度算法。
多处理机环境下
集中式调度
分布式调度
3. 常用的几种实时调度算法
1)最早截止时间优先EDF (Earliest Deadline First)
根据任务的开始截止时间来确定任务的优先级。截止时间越早,其优先级越高。
2)最低松弛度优先LLF (Least Laxity First)
根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高(松弛度值越小),优先级就越高。
松弛度= 截止完成时间 – 还需执行时间 - 当前时间
可理解为当前时刻到开始截止时刻间的差距,随着时间的推进,这个差值逐渐变小,任务越来越紧迫。
3.4 产生死锁的原因和必要条件
1、死锁(Deadlock):指多个进程在运行过程中,因争夺资源而造成的一种僵局。当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
- 死锁(Deadlock): 指进程之间无休止地互相等待!
- 饥饿(Starvation):指一个进程无休止地等待!
2、产生死锁的原因可归结为如下两点:
- 竞争资源。系统中供多个进程共享的资源如打印机、公用队列等的数目不满足需要时,会引起资源竞争而产生死锁。
- 进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,同样会导致死锁。
3、产生死锁的必要条件
形成死锁的四个必要条件(四个条件都具备就会死锁,缺一就不会死锁)
- 互斥条件:进程对所分配到的资源进行排他性使用
- 请求和保持条件:进程已经保持了至少一个资源,又提出新的资源请求,而新请求资源被其他进程占有只能造成自身进程阻塞,但对自己已获得的其他资源保持不放,必然影响其他进程。
- 不剥夺条件:进程已获得的资源未使用完之前不能被剥夺,只能在使用完时由自己释放。
- 环路等待条件
4、处理死锁的基本方法
1)事先预防
- 预防死锁
- 避免死锁
2)事后处理
- 检测死锁
- 解除死锁
3.5 预防死锁的方法、死锁的检测与解除
当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此系统必须:
- 保存有关资源的请求和分配信息;
- 提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。
1、资源分配图
系统死锁可利用资源分配图来描述。
- 圆圈表示进程
- 方框表示一类资源,其中的一个点代表一个该类资源
- 请求边由进程指向方框中的资源
- 分配边则由方框中的一个点即资源。
2、死锁的检测
1)检测时机:
当进程等待时检测死锁
定时检测
系统资源利用率下降时检测死锁
2)死锁定理
利用资源分配图简化法来检测死锁。
简化方法如下:
1.在资源分配图中找出一个既不阻塞又非独立的进程结点Pi,在顺利的情况下运行完毕,释放其占有的全部资源。
2.由于释放了资源,这样能使其它被阻塞的进程获得资源继续运行。消去了Pi的边。
3.经过一系列简化后,若能消去图中所有边,使结点都孤立,称该图是可完全简化的。
S状态为死锁状态的充分条件是当且仅当S状态的资源分配图是不可完全简化的。<死锁定理>
3) 死锁的解除
当发现进程死锁时,便应立即把它们从死锁状态中解脱出来。常采用的方法是:
- 剥夺资源。从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
- 撤销进程。最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。