第三章 处理机调度与死锁
3.1 处理机调度的层次和调度算法的目标
处理机调度的层次
高级调度(作业调度)
调度对象是作业,主要用于多道批处理系统中。
低级调度(进程调度)
调度对象是进程,基本调度,在多道批处理、分时和实时三种类型的OS中,都必须配置这级调度。
中级调度(内存调度)
主要目的是提高内存利用率和系统吞吐量。
处理机调度算法的共同目标
资源利用率
C P U 的 利 用 率 = C P U 有 效 工 作 时 间 C P U 有 效 工 作 时 间 + C P U 空 闲 等 待 时 间 CPU的利用率=\frac{CPU有效工作时间}{CPU有效工作时间+CPU空闲等待时间}
CPU的利用率=
CPU有效工作时间+CPU空闲等待时间
CPU有效工作时间
公平性
诸进程都获得合理的CPU时间,不会发生进程饥饿现象。
平衡性
CPU都能经常处于忙碌状态;系统资源的平衡性。
策略强制执行
如安全策略。
批处理系统的目标
平均周期时间短
周转时间:从作业被提交给系统开始,到作业完成为止的这段时间间隔,包括作业在外存后备队列上等待调度的时间,进程在就绪队列上等待进程调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间。
平均周转时间最短,有效提高系统资源利用率,可使大部分用户满意。
平均周转时间:
T = 1 n [ ∑ i = 1 n T i ] T=\frac{1}{n}[\sum_{i=1}^{n}{T_i}]
T=
n
1
[
i=1
∑
n
T
i
]
平均带权周转时间:
W = 1 n ∑ i = 1 n T i T s W=\frac{1}{n}\sum_{i=1}^{n}{\frac{T_i}{T_s}}
W=
n
1
i=1
∑
n
T
s
T
i
作业周转时间T TT,系统为其服务时间T s T_sT
s
系统吞吐量高
吞吐量:在单位时间内系统所完成的作业数
处理机利用率高
分时系统的目标
响应时间快
响应时间:从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为止的一段时间间隔。
均衡性
均衡性:系统响应时间的快慢应与用户所请求服务的复杂性相适应。
实时系统的目标
截止时间的保证
截止时间:某任务必须开始执行的最迟时间,或必须完成的最迟时间
可预测性
3.2 作业与作业调度
作业:包含程序、数据、作业说明书。
作业步:完成作业的每一个加工步骤。
作业控制块JCB:是作业在系统中存在的标志。
作业运行的三个阶段和三种状态
收容阶段。 后备状态
运行阶段。 运行状态
完成阶段。 完成状态
作业调度的主要任务
接纳多少个作业(允许多少个作业同时在内存中运行)
接纳哪些作业(取决于所采用的调度算法)
先来先服务FCFS调度算法
作业调度√,进程调度√
系统按照作业到达的先后顺序来进行调度,优先考虑等待时间最长的作业。
有利于长作业(进程),不利于短作业(进程)
有利于CPU繁忙型作业,不利于I/O繁忙型作业
短作业优先SJF调度算法
作业调度√,进程调度√
以作业长短来计算优先级,作业越短,优先级越高。作业的长短是以作业所要求的运行时间来衡量的。
缺点:
必须预知作业的运行时间
对长作业非常不利
人-机无法交互
未考虑作业的紧迫程度
优先级调度PSA算法
作业调度√,进程调度√
基于作业的紧迫度,由外部赋予作业相应的优先级。
高响应比优先调度HRRN算法
进程都到之后开始计算优先权。
动态优先级
优 先 权 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 = 响 应 时 间 要 求 服 务 时 间 = 响 应 比 R p 优先权=\frac{等待时间+要求服务时间}{要求服务时间}=\frac{响应时间}{要求服务时间}=响应比R_p
优先权=
要求服务时间
等待时间+要求服务时间
要求服务时间
响应时间
=响应比R
p
作业等待时间相同,服务时间越短,优先级越高
要求服务时间相同,等待时间越长,优先级越高
厂作业优先级可以随等待时间的增加而提高
缺点:每次调度都需计算
3.3 进程调度
进程调度的任务
保存处理机的现场信息
按某种算法选取进程
把处理器分配给进程
进程调度机制
排队器
分派器
上下文切换器
进程调度方式
非抢占方式:一旦分配给某进程,就一直让它运行下去。
正在执行的进程运行完毕,或因发生某时间而使其无法再继续运行
正在执行中的进程因提出I/O请求而暂停执行
进程通信或同步过程中,执行了某种原语操作
抢占方式:允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程
优先权原则
短进程优先原则
时间片原则
轮转调度RR算法
一个时间片尚未用完,正在允许的进程便已完成
在一个时间片用完时,计时器中断处理程序被激活,若进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
多级反馈队列调度算法
设置多个就绪队列(优先级逐个降低,时间片逐个增大)
每个队列都采用FCFS算法(新进程进入,加入第一队列末尾,若未在时间片内完成,则到第二队列末尾)
按队列优先级调度
调度算法的性能
终端型用户
短批处理作业用户
长批处理作业用户
3.5 死锁概述
死锁产生原因:多个进程对资源的争夺
竞争不可抢占性资源引起死锁
竞争可消耗资源引起死锁
进程推进顺序不当引起死锁
如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。
产生死锁的必要条件:
互斥条件
请求和保持条件
不可抢占条件
循环等待条件
处理死锁的方法:
预防死锁
避免死锁
检测死锁
解除死锁
预防死锁
破坏四个必要条件之一,其中互斥不能破坏。
破坏“请求和保持”条件:进程在中间不会请求新的资源
破坏“不可抢占”条件:不可抢占→可抢占,影响进程执行效率
破坏“循环等待”条件:规定每个进程必须按序号递增的顺序请求资源
避免死锁
安全状态:系统能按某种进程推进顺序(P 1 , P 2 , … , P n P_1,P_2,…,P_nP
1
,P
2
,…,P
n
)为每个进程P i P_iP
i
分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。
银行家算法避免死锁
四个数据结构:
可利用资源向量Available
最大需求矩阵Max
分配矩阵Allocation
需求矩阵Need
N e e d [ i , j ] = M a x [ i , j ] − A l l o c a t i o n [ i , j ] Need[i,j]=Max[i,j]-Allocation[i,j]Need[i,j]=Max[i,j]−Allocation[i,j]
银行家算法:
R e q u e s t i [ j ] ≤ N e e d [ i , j ] Request_i[j]≤Need[i,j]Request
i
[j]≤Need[i,j],便转向步骤2;否则认为出错。
R e q u e s t i [ j ] ≤ A v a i l a b l e [ j ] Request_i[j]≤Available[j]Request
i
[j]≤Available[j],便转向步骤3;否则表示尚无足够资源,P i P_iP
i
须等待。
系统试探着把资源分配给进程P i P_iP
i
,并修改下面数据结构中的数值:
A v a i l a b l e [ j ] = A v a i l a b l e [ j ] − R e q u e s t i [ j ] ; Available[j]=Available[j]-Request_i[j];Available[j]=Available[j]−Request
i
[j];
A l l o c a t i o n [ i , j ] = A l l o c a t i o n [ i , j ] + R e q u e s t i [ j ] ; Allocation[i,j]=Allocation[i,j]+Request_i[j];Allocation[i,j]=Allocation[i,j]+Request
i
[j];
N e e d [ i , j ] = N e e d [ i , j ] − R e q u e s t i [ j ] ; Need[i,j]=Need[i,j]-Request_i[j];Need[i,j]=Need[i,j]−Request
i
[j];
系统执行安全性算法,检查此次资源分配后系统是否处于安全状态,若安全才正式将资源分配 给进程P i P_iP
i
,否则作废,恢复原来的资源分配状态。
安全性算法:
设置两个向量:
工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,W o r k = A v a i l a b l e Work=AvailableWork=Available
Finish,表示系统是否有足够的资源分配给进程,使之运行完成。开始时F i n i s h [ i ] = f a l s e Finish[i]=falseFinish[i]=false;当有足够资源分配给进程时,F i n i s h [ i ] = t r u e Finish[i]=trueFinish[i]=true
从进程集合中找到一个能满足下述条件的进程
F i n i s h [ i ] = f a l s e Finish[i]=falseFinish[i]=false
N e e d [ i , j ] ≤ W o r k [ j ] Need[i,j]≤Work[j]Need[i,j]≤Work[j]
若找到,执行步骤3,否则执行4
当进程P i P_iP
i
获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
W o r k [ j ] = W o r k [ j ] + A l l o c a t i o n [ i , j ] ; Work[j]=Work[j]+Allocation[i,j];Work[j]=Work[j]+Allocation[i,j];
F i n i s h [ i ] = t r u e ; Finish[i]=true;Finish[i]=true;
go to step 2
如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态。
3.8 死锁的检测与解除
资源分配图
S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。
解除死锁
抢占资源
终止(或撤销)进程