安全序列:指如果系统按照某种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁。(处于不安全状态未必就是发生了死锁,但发生死锁一定是在不安全状态)。
银行家算法中的数据结构:
为了实现银行家算法,在系统中必须设置这个样四个数据结构,分别用来描述系统中可利用的资源,所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况.
1)可利用资源向量Available。这是一个含有m各元素的素组,其中的每一个元素代表医类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
2)最大需求矩阵MAX。这是一个n*m的矩阵,他定了系统中n个进程中的每个进程对m类资源的最大需求。如果Max[i,j] = K,则表示进程i需要Rj 类资源的最大数目为K。
3)分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Available[i,j]=K,则表示进程 i 当前己分得Rj类资源的数目为K。
4)需求矩阵Need.这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j] = K,则表示进程i还需要Rj类资源K个方能完成其任务。
Need[i,j] = Max[i,j] - allocation[i, j]
例题:
在银行家算法中,若出现下面的资源分配情况:
Process | MAX | Need | Available |
---|---|---|---|
P0 | 0 0 4 4 | 0 0 1 2 | 1 6 2 2 |
P1 | 2 7 5 0 | 1 7 5 0 | |
P2 | 3 6 10 10 | 2 3 5 6 | |
P3 | 0 9 8 4 | 0 6 5 2 | |
P4 | 0 6 6 10 | 0 6 5 6 |
(1)请计算分配矩阵的值,并判断该状态是否安全?
(2)若进程P2提示要求Request(1,2,2,2),系统能否把资源分配给它?
(3)如果系统立即满足P2的上诉请求,请问系统是否立即进入死锁状态?
解
1)
Allocation=MAX-Need
Process | Allocation |
---|---|
P0 | 0 0 3 2 |
P1 | 1 0 0 0 |
P2 | 1 3 5 4 |
P3 | 0 3 3 2 |
P4 | 0 0 1 4 |
利用安全性算法对上面的状态进行分析,找到了一个安全序列{P0,P3,P4,P1,P2},故系统是安全的。
2)P2发出请求向量Request(1,2,2,2)后,系统按银行家算法进行检查
①Request(1,2,2,2)<=Need(2,3,5,6)
②Request(1,2,2,2)<=Available(1,6,2,2)
③系统先夹定可为P2分配资源,并修改Available,Allocation,Need向量
Available=(0,4,0,0)
Allocation=(2,5,7,8)
Need=(1,1,3,4)
④进行安全性检查:此时对所有的进程,条件Need<=Available(0,4,0,0)都不成立,即Available不能满足任何进程的要求,故系统进入不安全状态。
因此当进程P2提出请求Request(1,2,2,2)后,系统不能把资源分配给它。
3)系统立即满足进程P2的请求(1,2,2,2)后,并没有马上进入死锁状态。因为,此时上诉进程并没有申请新的资源,并因得不到资源而进入阻塞状态。只有当上诉进程提出新的请求,导致所有没执行完的多个进程因得不到资源而阻塞并形成循环等待链的时候,系统才进入阻塞状态。