> 文章列表 > DJ3-7 避免死锁

DJ3-7 避免死锁

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)安全性算法检测结果如下: