死锁
产生死锁的四个条件
- 资源互斥:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
- 不可剥夺:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
- 请求保持:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
- 循环等待:在发生死锁时必然存在一个进程等待队列{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。
银行家算法的核心是安全性检测子算法,这个子算法实际上就是个寻找安全序列的过程,如果能够找到一个安全的给进程分配资源的序列,就认为是安全的。