7.5 死锁避免
- 死锁避免:死锁避免算法动态地检测资源分配状态以确保循环等待条件不可能成立
-
资源分配状态:可用资源、已分配资源、进程最大需求
7.5.1 安全状态
-
安全状态:如果存在一个安全序列,那么系统处于安全状态
-
安全序列:进程顺序
<P1,P2,...Pn>,如果对于每个Pi,Pi仍然可以申请的资源数小于当前可用资源加上所有进程Pj(其中j<i)所占用的资源,那么这一顺序称为安全序列 -
死锁状态是不安全状态的子集,如图

-
当系统收到进程发送的申请资源的申请,先假设将进程申请的资源分配给进程,然后根据分配出去之后的资源分配状态来计算当前是否具有安全序列,如果具有就是安全状态,可以将申请的资源分配给进程
7.5.2 资源分配图算法
-
适用范围:每个资源类型只有一个实例
- 算法实现
- 首先实现 7.2.2中的资源分配图
- 然后定义需求边
- 表示进程
Pi可能在将来某个时间申请资源Rj - 用虚线表示
- 表示进程
- 定义边之间的转换
- 当进程
Pi可能在申请资源Rj时,需求边Pi->Rj变为申请边 - 当进程
Pi释放资源Rj时,分配边变为需求边
- 当进程
- 假设进程
Pi申请资源Rj,只有在将申请边Pi->Rj变为分配边Rj->Pi而不会导致资源分配图形成环时,才允许申请
- 算法时间复杂度
n*n- n是系统的进程数量
- 例如
—
7.5.3 银行家算法
-
适用范围:每个资源类型有多个实例的资源分配系统
- 算法思路
- 当新进程进入系统时,必须要说明其可能需要的每种类型资源实例的最大数量
- 当用户申请一组资源时,系统必须确定这些资源的分配是否仍会使系统处于安全状态
- 如果是,则分配资源
- 否则,进程必须等待直到某个其他进程释放足够资源为止
- 数据结构(
n为系统进程个数,m为资源类型的种类)Available:长度为m的向量,表示每种资源的现有实例的数量Max:n*m矩阵,定义每个进程的最大需求Allocation:n*m矩阵,定义每个进程现在所分配的各种资源类型的实例数量Need:n*m矩阵,表示每个进程还需要的剩余的资源
- 安全性算法:确定计算机系统是否处于安全状态的算法分为如下几步
- 设
Work和Finish分别为长度为m和n的向量Work=Available for i in range(0,n): Finish[i]=false - 查找这样的
i使其满足Finish[i]=falseNeed[i]<=work
如果没有这样的i,转到第4步
-
Work=Work+Allocation[i] Finish[i]=true返回第二步
- 如果对所有
i,Finish[i]=true,那么系统处于安全状态
- 设
- 资源请求算法
- 设
Requesti为进程Pi的请求向量,Requesti[j]=k的意思是:进程Pi需要资源类型Rj的实例数量为k - 当进程
Pi做出资源请求时,采取如下动作- 如果
Requesti<=Needi,转到第2步,否则报错,因为进程Pi已超过最大请求 - 如果
Requesti<=Available,转到第3步,否则Pi必须等待,这是因为没有可用资源 - 假定系统可以分配给进程
Pi所请求的资源,并按如下方式修改状态Available=Available-Requesti; Allocationi=Allocationi+Requesti; Needi=Needi-Requesti然后使用安全性算法判断当前状态是否安全,如果安全则分配资源,否则
Pi等待 — © 2018 T0UGH. All rights reserved.
- 如果
- 设