1、死锁:
指两个以上的进程都要求对方已经占有的资源,导致无法进行下去的现象。
2.产生死锁的必要条件
从以上分析可见,如果在计算机系统中同时具备下面四个必要条件时,那麽会发生死锁。换句话说,只要下面四个条件有一个不具备,系统就不会出现死锁。
- 互斥条件 ---> 独占锁的特点之一。
- 请求与保持条件 ---> 独占锁的特点之一,尝试获取锁时并不会释放已经持有的锁
- 不剥夺条件 ---> 独占锁的特点之一。
- 循环等待条件 ---> 唯一需要记忆的造成死锁的条件。
上面我们提到的这四个条件在死锁时会同时发生。也就是说,只要有一个必要条件不满足,则死锁就可以排除。
银行家算法的实现思想
允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。
银行家算法主要分为两部分,安全检测和资源请求部分。该算法主要有四大数据结构:
下面简要介绍一下:
Resource:系统中的资源总量
Available:系统中尚未分配的,可以使用的资源量
Need:每个进程对每种资源的最大需求量。(一行代表某个进程,一列代表某种资源)
Allocation:目前已经分配的情况
安全检测
若在资源请求的时候,本次的请求超过了它最初的资源要求总量,那么该进程就会因为总资源数不足而挂起。如果满足那么继续判断: 如果申请的资源数,大于可以使用的资源数,那么该进程就会因为可用资源数不足而挂起。否则继续分配。
资源分配算法(此部分就是实现步骤)
下面用一个实例来说明银行家算法的实现:
如图,系统中有三种资源R1,R2,R3,总量分别是9,3,6。当前已经将他们分配给了4个进程,问是否存在一个安全序列P,使得这组进程在执行期间处于安全状态?
由前面的两个矩阵和总资源数,很容易算出可供分配的资源数为(0,1,1).
如何得出的呢?
在Allocation(已经分配)分别竖着计算对应:
R1 R2 R3
9 2 5
总量为:9 3 6,所以得出剩余 0 1 1
于是我们就可以分析一下该算法的过程了:
1. 首先我们先按顺序,将所有的可分配资源分配给P1,得出此时P1的资源数(左边),和P1的最大资源需求数(右边的need)。发现此时p1的资源不足以让运行,于是不分配给p1,让它暂时挂起,继续判断:
P1进程,已经得到的资源,如上图 为: 1 0 0
加上末分配的资源 0 1 1,所以当前获得为的1 1 1
2. 接着我们按顺序,把所有的资源分配给P2,这个时候分配的资源数已经足够满足need矩阵了,程序顺利运行,然后退出的时候将所占有的资源全部释放,此时Available(可用资源数)增加,增加的量就是原P2所占有的量,从解题步骤来看,Available的数值就是我们之前假设的把所有资源都加在P2那时候的状态。
P2进程,已经获得的资源,如下图 为 6 1 2 + 0 1 1 =6 2 3 > 6 1 2,所以P2运行
运行后,释放 6 2 3
3. 此时因为资源增加了,可以将之前的P1再分配资源看看够不够,或者直接向下给P3分配。都可以,不过推荐第一种方式,因为怕遗漏。
P1进程,已经得到的资源,如上图 为: 1 0 0 +P1释放的资源 6 2 3 =7 2 3
4. 然后重复上面的操作,如果始终有某个进程不能满足,那么就不存在安全状态,否则全部程序能按此顺序完成,这就是安全状态。
我们发现,按照刚刚执行的顺序, <P2 ->P1->P3 ->P4>,那么这组进程一定不会发生死锁,也就是我们说的安全序列。
当然上面的P3和P1的顺序调换,也是安全序列。所以,安全序列有可能不止一个。 到了最后的进程退出的时候,注意到Available的值一定等于总资源数。