死锁 && 银行家算法

死锁

产生死锁的四个条件

  • 资源互斥:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
  • 不可剥夺:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
  • 请求保持:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
  • 循环等待:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所申请的资源。

循环等待需要前三个条件满足,这四个条件同时满足死锁才会存在。

破坏上述四个条件中的一个就可以预防死锁

解决死锁的方法:

  • 预防死锁:

    • 摒弃请求保持条件,要求所有进程一次性申请其所需的全部资源,不允许进程追加资源请求
    • 摒弃不剥夺条件:对于一个已经保持了某些资源的进程,若新的资源请求不能立刻满足,就释放自己所占有的所有资源。
    • 摒弃循环等待条件:为所有的资源按照类型进行线性排队,并赋予序号,所有进程对资源的请求必须严格按照资源序号提出。
  • 避免死锁:

    在资源的动态分配过程中,使用某种方法防止系统进入不安全状态,从而避免死锁的发生。----银行家算法

  • 检测死锁然后解除死锁:

    • 剥夺资源:发现系统中有进程死锁后,从其他进程剥夺足够的资源给死锁进程,解除进程的死锁状态。
    • 撤销进程:将所有发生死锁的进程都撤销。

银行家算法:

银行家即操作系统,贷款就是资源,客户就是进程

进程想要向操作系统申请资源,操作系统查看自己是否有足够的资源,若自己有足够的资源就分配给进程。

银行家算法中包含几个数据结构:

  • 可利用资源向量Available:是一个具有m个元素的数组,表示系统中现有的各种资源的个数。
  • 最大需求矩阵Max,是一个nxm的矩阵,Max(i,j)表示进程i需要Rj类资源的最大个数
  • 分配矩阵Allocation,一个nxm的矩阵,表示已经分配给进程的各个资源个数,Allocation(i,j)=k 表示进程i已经获得Rj类资源有k个
  • 需求矩阵Need,一个nxm的矩阵,表示进程还需要的每种资源的个数,Need(i,j)=k 表示进程i还需要Rj类资源有k个

从上述变量可以知道,Need+Allocation=Max;

银行家算法执行过程:

当进程P申请资源时,假设P的请求向量为request

(1)如果request<=Need,就继续执行,否则认为出错,该进程继续等待

(2)如果request>Max,表示操作系统没有足够的资源分配,让该进程继续等待

(3)上述检查没问题就尝试给进程P分配资源,并修改各个数组中的数值

(4)系统执行安全性检查,若此次分配资源后系统处于安全状态,就正式分配资源给进程P。

银行家算法的核心是安全性检测子算法,这个子算法实际上就是个寻找安全序列的过程,如果能够找到一个安全的给进程分配资源的序列,就认为是安全的。

死锁 && 银行家算法_第1张图片

你可能感兴趣的:(操作系统,死锁,银行家算法,java)