操作系统面试—死锁(二)——银行家算法

本文是对操作系统概念(第七版)第七章——死锁的学习总结,不足之处欢迎批评指正。

上文中我们提到了资源分配图算法,只适合每种资源只有一个实例的情况。当每种资源不止一个实例时,资源分配图算法将不再适合,因此需要用到我们这一章要讲的银行家算法。

银行家算法的命名是它可以用了银行系统,当不能满足所有客户的需求时,银行绝不会分配其资金。

当新进程进入系统时,它必须说明其可能需要的每种类型资源实例的最大数量这一数量不可以超过系统资源的总和。当用户申请一组资源时,系统必须确定这些资源的分配是否处于安全状态,如何安全,则分配,如果不安全,那么进程必须等待指导某个其他进程释放足够资源为止。


为了实现银行家算法,需要定义一下几个数据结构,n表示系统进程的个数,m表示资源类型的种类:

available——长度为m的向量,代表每种资源的现有实例的数量。

max——n*m矩阵,定义每个进程的最大需求量。

allocation——n*M矩阵,定义每个进程现在已经分配的各类资源的实例数量。

need——n*m矩阵,定义每个进程还需要的剩余的资源。

另外allocation-i代表分配进程pi的资源,need-i表示进程为完成其任务可能仍然需要申请的额外的资源。


首先我们讨论安全性算法

1、安全性算法

目的:确定计算机系统是否处于安全状态的算法分为一下几个步骤:

(1)设work和finish为长度为m和n的向量,并且按一下进行初始化,work=available;且对于i=0,1,...n-1,finish[i]=false;这里需要说明的是work代表剩余可用的资源。finish[i]=false代表进程i不满足要求。

(2)查找这样的i,使其满足

a、finish[i]=false;

b、need[i]<=work;//注意这里比较的是整行的资源,不是单独的资源。

如果没有这样的i存在,则转到(4)

(3)work=work+allocation-i;//现有可用的资源+进程pi释放的资源

         finish[i]=true;

返回到第(2)步

(4)如果对所有的i,finish[i]=true;那么系统处于安全状态。

上述算法的复杂度为m*n^2;

其实上述算法就是假设释放一个进程,然后在找一个能在剩余可用资源中完成请求的进程,重复操作。我们的目标是找一个安全序列,因此上述算法可能要尝试多次。只要能找到一个安全序列,那么系统就处于安全状态。


2、资源请求算法

现在,描述如何判断是否可安全允许请求的算法;

设request-i为进程i的请求向量,因此该向量的长度为m;当进程i做出请求时,采取如下动作:

(1)如果request-i<=need-i;那么转到第(2)步,否则产生出错条件,这是因为超出了最大请求。

(2)如果request<=available;那么转到第(3)步,否则产生出错,这是因为没有可用资源。

(3)假定系统可以分配给进程pi所请求的资源,那么按照如下形式修改状态:

available=available-request-i;

allocation-i=allocation-i+request-i;

need-i=need-i  -   request-i;

判断如果产生的资源分配状态是安全的,那么交易完成且进程pi可以分配到所请求的资源,如果不安全,那么进程pi必须等待request-i并恢复到原来资源分配状态。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章