DJ3-7 避免死锁
目录
一、系统安全状态
1. 安全状态
2. 安全状态例子
3. 由安全状态向不安全状态转换
1. 银行家算法中的数据结构
2. 银行家算法
3. 安全性算法
4. 安全性算法例子
5. 银行家算法例子
一、系统安全状态
1. 安全状态
2. 安全状态例子
首先分析每个进程还需要的资源数,判断可用资源数能够满足哪个进程。选择将资源分配给该进程,该进程使用完毕后将会释放所有资源,因此可用资源数增加,从而可以满足之前满足不了的进程。
3. 由安全状态向不安全状态转换
- 不按照安全序列分配资源
假设分配两台磁带机给 P1,一台磁带机给 P2 。在这种情况下,由于 P1 和 P2 的需求量还未被完全满足,因此也释放不了占用的资源。若 P1、P2 和 P3 在去申请资源,则会因为没有可用资源量而将自己阻塞,从而形成死锁。
二、利用银行家算法避免死锁
1. 银行家算法中的数据结构
根据定义,存在如下关系:
Need[i][j] = Max[i][j] - Available[i][j]
2. 银行家算法
Available[j] = Available[j] - Requesti[j];
Allocation[i][j] = Allocation[i][j] + Requesti[j];
Need[i][j] = Need[i][j] - Requesti[j];
如果在步骤(4)中检测出系统不安全,则需要回滚步骤(3),将各数据结构恢复为原来的值。
上述步骤的流程图如下:
3. 安全性算法
Work[j] = Work[i] + Allocation[i][j]; //释放资源
Finish[i] = true; //修改标志
go to step 2; //判断下一个进程
Q:既然有了 Available 那为什么还要设置 Work?
A:安全性算法只是一次试探,如果直接使用 Available,那么试探完毕后还要还原 Available 的值,因此不如做一个 Available 拷贝,即 Work 。
上述步骤的流程图如下:
4. 安全性算法例子
利用安全性算法对 T0 时刻的资源分配情况进行分析
由于 Work=Available,因此我们首先知道了 Work 的初始值。然后,再来看 Work 值能够满足哪些进程的 Need,挑选这些进程中的一个来执行。
进程 1、2 和 3 都能执行,我们随机挑选进程 1 来执行。
5. 银行家算法例子
题目由上一节给出。
3)形成的资源变化如下:
3)安全性算法检测结果如下: