一、安全状态与不安全状态
系统处于安全状态时,就可避免死锁;处于不安全状态时,可能发生死锁。
所谓安全状态,是指系统此时能找到一个进程的序列<P1,P2,P3…Pn>,只要按照此顺序为其分配资源,就能使每个进程都能顺利完成。如果存在一个安全序列,那么系统则处于安全状态,否则就处于不安全状态。
在避免死锁方法中,允许进程动态地申请资源,但是系统在分配资源之间,会先计算此次资源分配的安全性,安全的话才分配,不安全的话便令进程等待。
二、计算资源分配安全性的两种方法
1. 资源分配图算法
(1)适用情况
每个资源类型只包含一个实例时可以使用。(为什么呢?因为只有当每种资源都是一个实例时,图中出现了环才表明这组进程出现了循环等待情况,才能断定是死锁的,如果有的资源不是一个实例的话,出现了环则可能发生了死锁,也可能没发生)
(2)判断方法
需求边 P2→ R2,表示进程 P2 在将来某个时刻会申请资源 R2,用虚线表示,如下面左图。
判断 P2 的这个申请是否会造成不安全状态:
假设已经将资源分配给 P2,所以要把 P2→ R2 的需求边转换为 R2→ P2 的分配边,如下面右图。
此时发现整个图中出现了环,所以现在进行 R2→ P2 的分配是不安全的。
(同样,如果没有出现环的话,就是安全的,是不是很简单呢)
2. 银行家算法
(1)数据结构
系统相关:
Available:可以利用的资源数组。Available[ j ] = K,说明 j 资源还有 K 个(也就是还剩下的资源)
进程相关:
最大需求矩阵 Max:进程所需要的总资源向量。Max [ i ,j ] = M ,说明进程 Pi 总共需要 M 个 j 资源。
需求矩阵 Need:进程还需要的资源向量。Need [ i ,j ] = N ,说明进程 Pi 还需要 N 个 j 资源。
分配矩阵 Allocation:进程已经被分配的资源数目向量。Allocation [ i ,j ] = A ,说明进程 Pi 已经获得了 A 个 j 资源。
请求矩阵 Request:进程发出的资源请求向量。
那么是不是很容易想到: Need [ i ,j ] = Max [ i ,j ] - Allocation [ i ,j ] ,因为有时候题目上不会直接给出 Need 序列,需要自己先计算一下。
(2)银行家算法
直接拿做题过程来举例:
① 首先检查进程申请的各资源数量是否比它自己所需要的还多,是的话,出错,不分配。
② 否则检查进程申请的各资源数量是否比系统可以提供的还多,是的话,分配失败,等待。
③ 否则假设可以为其分配,修改 Pi 的相关矩阵:
Available = Available – Request[i] //系统资源减少
Allocation[i] = Allocationi + Request[i] //进程已分配的增加
Need[i]= Need[i] – Request[i] //进程需要的减少
④ 然后进行安全性检查。
Work 矩阵是什么?其实就是检查算法中的一个代替 Available 的临时矩阵。
当进程 Pi 执行完之后,它会释放资源,那么此时 Work = Work(原来系统剩余) + Allocation(Pi释放的)