对死锁的理解

xiaoxiao2021-02-28  202

一、死锁的定义: 死锁是指两个或两个以上的进程在执行过程中,由于资源竞争或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法推进下去,此时称系统处于死锁状态,这些永远在互相等待的进程称为死锁进程。

二、死锁的原因: (1)因为系统资源不足; (2)进程运行推进的循序不合适; (3)资源分配不当;

三、死锁产生的四个必要条件: (1)互斥条件:进程(线程)所申请的资源在一段时间内只能被一个进程(线程)锁占用。 (2)请求与保持关系:一个进程因请求资源而阻塞时,对已获得资源保持不变; (3)不可抢占条件:进程已获得的资源,在未使用完之前,不能强行剥夺; (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;

四、处理死锁的方法: 破坏保持条件: 1.所有进程在开始运行之前,必须一次性获得所有资源,如果无法获得完全,释放已经获得的资源,等待; 2.所有进程在开始运行之前,只获得初始运行所需要的资源,然后在运行过程中不断请求新的资源,同时释放自己已经用完的资源。     相比第一种而言,第二种方式要更加节省资源,不会浪费(因为第一种可能出现一种资源只在进程结束用那么一小下,但却从头到尾都被占用,使用效率极低),而且,减少了进程饥饿的情况。

破坏不可抢占条件: 说起来简单,只要当一个进程申请一个资源,然而却申请不到的时候,必须释放已经申请到的所有资源。但是做起来很复杂,需要付出很大的代价,加入该进程已经持有了类似打印机(或者其他的有必要连续工作的)这样的设备,申请其他资源的时候失败了,必须释放打印机资源,但是人家用打印机已经用过一段时间了,此时释放打印机资源很可能造成之后再次是用打印机时两次运行的信息不连续(得不到正确的结果)

破坏循环等待条件: 设立一个规则,让进程获取资源的时候按照一定的顺序依次申请,不能违背这个顺序的规则。必须按照顺序申请和释放,想要申请后面的资源必须先把该资源之前的资源全部申请,想要申请前面的资源必须先把该资源之后的资源(前提是已获得)全部释放

破坏互斥条件: 没法破坏,是资源本身的性质所引起的

常用的解除死锁的两种方法 (1)抢占资源:从一个或者多个进程中抢占足够的资源,分配给死锁进程,用于解除死锁; (2)终止(或撤销)进程:终止(或撤销)系统中的一个或者多个死锁进程,直至打破死锁循环环路,使系统从死锁中解除出来

五、利用银行家算法避免死锁 银行家算法需要的数据结构:1.可利用资源向量(Available);2.最大需求矩阵(Max);3.分配矩阵(Allocation);4.需求矩阵(Need)。

上述三个矩阵存在如下关系 Need[i,j]=Max[i,j]-Allocation[i,j]; 说的看似很难懂的样子,下面详解一下就很好理解了。

可利用资源向量(Available):这么说吧,比如当前有三种资源A,B,C,可利用资源向量就是一个数组(为了在程序中使用),我们理解的话就说ABC各有多少个资源,例子

A B C

7 2 5

这里7,2,5三个资源的数目组合起来就是一个数组(向量) 最大需求矩阵(Max):说是矩阵完全是为了在编程时使用方便(就是一个二维数组),我们理解的话就说是进程工作需要的每个资源的总数目,例子

A B C

P1 1 1 1

这样一看就明白了,进程P1需要三种资源各一个(这个不是二维数组啊,是一维的?怎么可能只有一个进程这是一对进程思死锁的解决办法!),多加几个进程就二维数组了

分配矩阵(Allocation):和需求矩阵类似,只是数值的含义变成了,目前已经给进程某某(行值i),分配了多少的某某(列值j)资源

需求矩阵(Need):根据上面的公式就可以看出,这个是进程目前还需要多少资源才可以运行,和最大需求不一样,最大需求是一共需要的数目。

有了这些我们使用银行家算法就够了,我们使用该算法的目的是什么?是避免死锁,避免死锁的意思就是我们使用这些数据结构来推断如果按某种顺序执行进程队列,是否是安全的(是否会造成死锁)

上图是一个简单的图实例,为了计算机程序运行方便,我们一般假设从P0进程开始运行,那么就要给P0分配足够运行的资源(就是把NEED都给了,前提是当前Available资源数目足够该进程的Need),然后计算Available(new)=Available(old)+Allocation(P),其中Allocation就是执行的进程之前已经分配的资源执行完成之后自然要会收到Available里。

题目一般都会给上图的表,然后让你写出安全序列,用当前的Available看满足哪个进程的Need然后就先执行它,执行完后回收(加到Available中)该进程的Allocation就可以了,这样一步一步算到最后如果Available一直算下来没有亏损不够的情况证明这个序列就是一个安全队列了~!

转载请注明原文地址: https://www.6miu.com/read-26211.html

最新回复(0)