避免死锁同样是属于事先预防的策略,但并不是事先采取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免
发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能。
1.系统安全状态:
避免死锁的方法中,允许进程动态地申请资源,但系统在进行过资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,
则将资源分配给进程;否则,让进程等待。
所谓安全状态,是指系统能按某种进程推进顺序(P1,P2,P3,...,Pn),为每个进程 Pi 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可
顺序地完成。此时称 P1 , P2 , ..,Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。
并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。
2.银行家算法:
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源
相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以
满足它的最大需求量则按当前的申请分配资源,否则就推迟分配。当进程在执行中继续申请时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该
进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,
否则,也要推迟分配。
(1)、数据结构描述:
可利用资源矢量:Available :含有m 个元素的数组,其中的每一个元素代表一类可用资源的数目。 Available[ j ] = k , 则表示系统中现有的 Rj 类资源 K 个。
最大需求矩阵Max :为 n* m 矩阵,定义了系统中 n 个进程中的每一个进程对 m 类资源的最大需求,简单来说,一行代表一个进程,一列代表一类资源。
Max[ i , j ] = k , 则表示进程 i 需要 Rj 类资源的最大数目为 k。
分配矩阵 Allocation : 为 n* m 矩阵,定义了系统中每一类资源当前已分配给每一个进程大的资源数。 Allocation[ i , j] = k , 则表示进程 i 当前已分得 Rj 类
资源的数目为 k 。
需求矩阵Need :为 n*m 矩阵,表示每个进程尚需的各类资源数。 Need[ i , j ] = k ,则表示进程 i 还需要 Rj 类资源的 数目为 k。
上面三个矩阵存在下述关系:
Need = Max - Allocation;
(2) 、银行家算法描述:
设Request i是进程 Pi 的请求矢量,如果 Request i [ j ] = k ,表示进程 Pi 需要 j 类资源 K个。当 Pi 发出资源请求后,系统按下述步骤进行
检查:
a. 如果 Request i [ j ] <= Need[ i , j ] ,便转向步骤 b ;否则认为出错,因为它所需要的资源已经超过它所宣布的最大值。
b. 如果 Request i [ j ] <= Available[ j ] ,便转向步骤c ;否则,表示尚无足够资源,Pi 须等待。
c. 系统试探着把资源分配给进程 Pi ,并修改下面数据结构中的数值:
Available = Available - Request i;
Allocation[ i , j ] = Allocation[ i , j ] + Request i [ j ] ;
Need[ i , j ] = Need[ i , j ] - Request i [ j ] ;
d.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程 Pi ,以完成本次分配;否则,将本次的试探
分配作废,恢复原来的资源分配状态,让进程 Pi 等待。
(3)、安全性算法:
a.初始时安全序列为空
b.从 Need 矩阵中找到符合下面条件的行: 该行对应的进程不在安全序列中而且该行小于 Available 向量,找到后,把对应的进程加入安全序列中;
如果找不到,执行步骤 d
c. 当进程 Pi 进入安全序列后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Available = Available + Allocation[ i ] ,其中 Allocation[ i ] 表示进程 Pi 代表的在 Allocation 矩阵中对应的行,返回步骤 b
d. 如果此时安全序列中已经有所有的进程,则系统处于安全状态,否则,系统处于不安全状态。