3.1处理机调度的层次和调度算法的目标
处理机调度的层次
- 高级调度:作业调度、长程调度;作业;主要应用在批处理系统。
- 低级调度:进程调度、短程调度;进程(或内核级线程);多道批处理、分时、实时系统都必须配置。
- 中级调度:又称为内存调度,交换调度;进程。
处理机调度算法的共同目标
- 资源利用率
- 公平性
- 平衡性
- 策略强制执行性
批处理系统的目标
- 平均周转时间短(平均周转时间,平均带权周转时间)
- 系统吞吐量高:单位时间内系统所完成的作业数
- 处理机利用率高:CPU处于忙碌状态
分时系统的目标
- 响应时间快
- 均衡性:系统响应时间的快慢与用户所请求服务的复杂性相适应。
实时系统的目标
- 截止时间的保证(开始截止时间,完成截止时间)
- 可预测性(请求的可预测性)
3.2作业与作业调度
作业
- 程序段+数据段+作业说明
- 批处理系统中,从外存调入内存的基本单位
- 作业步:作业中相互独立又相互关联的顺序加工步骤
- 作业控制块(JCB):作业在系统中存在的标志
作业运行的三个阶段和三个状态
- 收容阶段:作业被输入到硬盘上,为其建立JCB,并把它放入后备队列的过程(后备状态)
- 运行阶段:从第一次进入就绪状态开始,直到它运行结束前(运行状态)
- 完成阶段:作业运行完成或者异常结束。程序回收JCB和所有资源,并将作业运行结果信息形成输出文件后输出。(完成状态)
作业调度的主要任务
- 根据JCB中信息检查系统资源能否满足作业对资源的需求
- 按照一定算法从外存后备队列中选取某些作业调入内存(接纳多少个作业?接纳哪些作业?)
- 为调入内存的作业创建进程,分配必要的资源
- 将新创建的进程排在就绪队列上等待调度
先来先服务算法(FCFS)
定义:
按照顺序依次进行
问题:
答案:
带权周转时间=周转时间/运行时间
T平均周转时间=周转时间之和/作业数
平均带权周转时间=带权周转时间之和/作业数
短作业优先算法
定义:
在同一时间段中,谁的运行时间短谁就先运行
问题:
答案:
短作业优先算法的优缺点
- 优点:
-
- 有效缩短作业的平均周转时间,提高系统的吞吐量
- 缺点:
-
- 必须预知作业的运行时间
- 对长作业非常不利
- 人机无法实现交互
- 未考虑作业(进程)的紧迫度
优先级调度算法
- 根据作业(进程)的紧迫度赋予它一个优先级
- 静态优先权:一旦确定,优先权不变
- 动态优先权:创建作业(进程)时所确定的优先权可以随着作业(进程)的推进而改变
高响应比优先调度算法(HRRN)
定义:
在同一时间段内如果可以进行多个进程,就要计算他的响应比,响应比高的先执行
问题:
答案:
高响应比优先调度算法的优点
- 如果作业的等待时间相同,则短作业优先
- 如果作业要求服务的时间相同,则先到达的作业优先
- 如果作业较长,则其优点权会随着等待时间的增加而逐渐提高
3.3进程调度
进程调度的任务
- 保存处理机的现场信息
- 按照某种算法选取进程
- 把处理器分配给进程
进程调度的方式
- 非抢占方式:一旦处理及分配给某个进程之后,就一直让它运行下去,直至进程完成或被阻塞
- 实现简单,系统开销小,适用于大多数批处理系统
- 不能用于分时系统和大多数实时系统
进程调度的方式
- 抢占方式:允许调度程序根据某种原则,暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一个进程
- 抢占的原则:
-
- 优先权原则
- 短进程优先原则
- 时间片原则
轮转调度算法(RR)
- 系统根据FCFS(FIFO)策略,将所有就绪进程排成一个就绪队列,并设置每隔一段时间激活系统的几次呢调度,将CPU分配给队列首进程
进程切换时机:
- 若一个时间片未完,但是正在运行的进程已经完成
- 一个时间片用完
时间片大小对响应时间的影响
例子1(q=1)
例子2(q=4)
优先级调度算法
- 把处理机分配给就绪队列中优先级最高的进程
- 非抢占式优先级调度算法:当前正在执行进程的处理机不会被抢占
- 抢占式优先级调度算法:只要出现优先级高的进程,则立即抢占处理机
多队列调度算法
- 不同类型或性质的进程固定分配在不同的就绪队列
- 不同队列采用不同的调度算法
- 同一个队列中的不同进程可以设置不同的优先级
- 不同的就绪队列本身也可以设置不同的优先级
多级反馈队列算法
多级反馈队列调度算法
- 设置多个就绪队列,并为每个队列设置不同的优先级。第一个队列优先级最高,但是时间片最小;最后一个队列优先级最低,时间片最大。
- 每个队列都采用FCFS算法,若一个时间片未执行完成,降到下一级队列末尾。最后一个队列采用RR方式运行。
- 按队列优先级进行调度。
- 新进程进入内存后,放置在第一队列的末尾按FCFS原则等待调度。
多级反馈队列算法的性能
- 终端型用户:若第一队列的一个时间片略大于多数人机交互的时间,则终端用户的作业基本可以在一个时间片内完成。
- 短作业用户:尽可能在一个时间片内完成,最多到第二或第三队列中完成,等待时间不会太长。
- 长作业用户:不用担心作业长时间不被处理。
基于公平原则的调度算法
- 保证调度算法:保证调度的公平性,即各进程获得基本平均的处理机时间
- 公平分享调度算法:保证每个用户活得基本平均的处理机时间
3.4实时调度
实现实时调度的基本条件
- 提供必要的信息:就绪时间,开始截止时间或完成截止时间,处理时间,资源要求,优先级
- 系统处理能力强
- 采用抢占式调度机制(硬实时)
- 具有快速切换机制:对中断快速响应的能力和对任务的快速分配能力
实时调度方式和算法选择
- 小型实时系统或要求不太严格的实时控制系统:简单易行的非抢占式轮转调度算法,响应时间一般为几秒或几十秒
- 有一定要求的实时控制系统:非抢占式优先先及调度算法,响应时间一般为几秒或几百毫秒
- 要求比较严格的实时系统:抢占式优先级调度算法(基于时钟中断的抢占式优先级调度算法,立即抢占的优先级调度算法)
最早截止时间时间优先算法(EDF)
- 根据任务的截止时间(开始或完成)确定任务的优先级,任务的截止时间越早,优先级越高
- 非抢占式调度方式用于非周期实时任务
- 抢占式调度方式用于周期性实时任务
非抢占式调度方式
抢占式调度方式
最低松弛度优先算法(LIF)
- 根据实时任务的最低松弛度(松弛度=任务必须完成的时间-任务本身运行的时间-当前时间)来确定优先权,松弛度越低,优先权越高
- 本算法主要采用抢占式调度方式,以确保任务队截止时间的要求
例题
假如在一个实时系统中有两个周期性实时任务A和B,任务A要求每20 ms执行一次,执行时间为10 ms,任务B要求每50 ms执行一次,执行时间为25 ms。由此可知,任务A和B每次必须完成的时间分别为:A1、A2、A3、…和B1、B2、B3、…。
优先级倒置
- 高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞的现象称为优先级倒置
- 规定进程进入临界区后,CPU不允许被抢占
- 动态优先级继承:临界区中的低优先级进程继承想使用临界区资源的高优先先及进程的优先级
3.5死锁概述
死锁定义
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
产生死锁的原因
- 竞争资源
- 进程推进顺序不当
产生死锁的必要条件
- 互斥条件:一段时间内某资源只能被一个进程占用
- 请求和保持条件:进程至少保持了一个资源,又申请被其他进程保持的资源
- 不可抢占条件:进程已经获得的资源在进程未使用之前不能被抢占
- 循环等待条件:发生死锁的进程,必然存在一个资源循环等待链
处理思索的方法
- 鸵鸟算法——不理睬,不处理
- 预防死锁——破坏死锁的必要条件
- 避免死锁——跟踪评估资源分配过程,调整
- 检测死锁——及时检测
- 解除死锁——撤销进程
3.6预防死锁
破坏“互斥”条件
- 把独占资源变成共享资源
- 某些资源本身的特性决定其不可共享,因此“互斥条件”不能被破坏,反而应该被保证
破坏“请求和保持”条件
- 第一种协议:所有进程开始运行前,必须一次性地申请全部资源
- 第二种协议:进程初期活得一部分资源后就可以运行,在运行过程中如果需要申请资源,则需要将自己已经申请到且已经使用完毕的资源释放掉,然后才可以申请新资源(先放再申请)
破坏“不可抢占”条件
- 一个已经保持了某些不可抢占资源的过程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请
破坏“循环等待”条件
- 将系统中的资源按类型赋予不同的序号,并规定所有的进程必须严格按照资源序号递增的顺序申请资源。因此,占据较低序号资源的进程可能会等待占据较高序号资源的进程释放资源,但是不可能存在反向等待,因此不会出现循环等待的情况。
3.7避免死锁
定义
- 再资源动态分配过程中,对进程发出的每一个系统能够满足的资源申请进程动态检查,若分配后系统发生死锁或可能发生死锁,则不予分配,否则予以分配
- 确保系统始终处于安全状态
安全状态和不安全状态
- 安全状态:不会发生死锁的状态,找到安全序列的状态
- 不安全状态:可能会发生死锁的状态
安全状态向不安全状态的转换
在T0时刻P3又申请了一台磁带机,若将剩余3台中的一台分配给P3则系统状态是安全的还是不安全的?
银行家算法
- 每一个新进程进入系统时,必须申明它在运行过程中可能需要的每种资源类型的最大单元数目,其数目不应该超过系统所拥有的资源总量
- 当进程请求一组资源时,系统首先确定是否有足够的资源分配给该进程。若有,则进一步计算资源分配给进程后,是否会使系统处于不安全状态,如果不会,才正式将资源分配给该进程。
银行家算法中的数据结构
- 可利用资源向量Available:Available[j]=K,表示系统中现有Rj类资源K个
- 最大需求矩阵Max:Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K
- 分配矩阵Allocation:Allocation[i,j]=K,表示进程i当前已分得Rj类资源的数目为K
- 需求矩阵Need[1..n,11..m]:Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务
算法步骤
- 设是进程Pi的请求向量,Requesti [j]=K,表示进程需要k个Rj类资源
- (1)若Requesti[j]<=Need[i,j],转(2);否则错误返回
- (2)若Requesti[j]<=Available[j],转(3);否则,表示尚无足够资源,Pi须等待;
- (3)系统尝试把资源分配给进程Pi,并修改以下数据结构:
Available[j]=Available[j]-Requesti[j]
Allocation[i,j]= Allocation[i,j]+Requesti[j]
Need[i,j]= Need[i,j]-Requesti[j]
- (4)执行安全检测算法,检查资源分配后系统是否处于安全状态。安全则正式分配,否则试探分配作废,恢复原来资源分配状态,让进程Pi等待
安全性算法
- (1)设置两个临时向量:工作向量Work:表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available
- Finish[n]:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够资源分配给进程时,再令Finish[i]=true
- (2)从进程集合中找到一个能满足下述条件的进程:
Finish[i]=false;
Need[i,j]≤Work[j];
若找到则执行步骤(3),否则执行步骤(4)
- (3)当进程Pi活得资源后,可顺利执行,直到完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+Allocation[i,j]
Finish[i]=true
go to step ②;
- (4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则系统处于不安全状态
示例1
假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图所示。
T0时刻的安全性
安全序列:{P1、P3、P4、P2、P0}
若进程P1提出请求Request(1,0,2),系统能否为它分配资源?
检查:①Request1(1,0,2)≤Need1(1,2,2);
②Request1(1,0,2)≤Available1(1,2,2)
系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量。
利用安全性算法检查此时系统是否安全。
3.8死锁的检测与解除
死锁检测
检测系统状态,以确定系统中是否发生了死锁
死锁解除
利用某种算法将系统从死锁状态中解脱出来
死锁定理
- S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的
资源分配图
- 简化
死锁检测算法(coffman算法)
- 可利用资源向量Available[m]
- 资源分配矩阵Allocation[n,m]
- 资源请求矩阵Request[n,m]
- 工作向量Work=Available
- Finish[n]向量:若Allocation[i]=0,则Finish[i]=True否则Finish[i]=False
算法描述
- (1)寻找同时满足下述条件的进程:
Finish[i]=False; Requesti≤Work
若找到,则转②;否则转③;
- (2)执行:Work=Work+Allocationi,Finish[i]=True,再转回第(1)步
- (3)判断:若对所有i=(0,1,2,...n-1),Finish[i]=True,则无死锁;否则,若Finish[i]=False,则进程Pi死锁
死锁的解除
- 抢占资源:从其他进程剥夺足够多的资源给死锁进程,以解除死锁状态
- 撤销进程:最简单最常用的方法是撤销全部进程;也可以按某种顺序逐个地撤销进程,直到死锁解除