之前的博客都多次提到了死锁问题,那么我们先来了解一下。
什么是死锁?
其实死锁是指在多道程序系统中,一组进程中的每一个进程均无期限的等待被该组进程中的另一个进程所占有且永远不会释放的资源,线程一样。这种现象称系统处于死锁状态,简称死锁。处于死锁状态的进程称为死锁进程。
产生死锁的四个必要条件:
其实死锁产生:1.资源竞争,2.多道程序运行时的进程推进顺序不合理。
也就是4个必要条件:
(1)互斥使用资源。
资源是独占且排他使用,进程/线程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而资源被领一个进程占有时,则申请者等待,知道资源被占用者释放
(2)请求和保持资源
进程每次申请他所需要一部分资源,在申请新的资源同时,继续占用已分配到的资源。
(3)不可抢夺资源
进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,只能由获得进程自愿释放
(4)循环等待资源。
又称环路等待。在发生死锁时,必然存在一个进程等待队列{P1,P2,P3,...Pn},其中P1等待P2占有资源,P2等待P3占有资源...Pn等待P1占有资源,形成一个进程等待环路。环路中每一个进程已占有的资源同时被另一个进程所申请,即前一个进程占有后一个进程所申请的资源。
记住,这4个条件是必要条件,只要系统发生死锁,则以上四个条件至少有一个成立。
既然会产生死锁问题,那么如何解决死锁呢?
(1)预防死锁:破坏4个死锁的必要条件,(1)为资源使用的固有特性,无法改变。
1.破坏“不可剥夺条件”。
2.破坏“请求和保持”
3.破坏“循环等待”
(2)死锁避免:
1.设置状态安全。
2.采用银行家算法。
(3)死锁检测与解除:
死锁检测:
1.为每一个进程和每个资源指定唯一编号。
2.设置资源分配状态表,每个表目包含“资源号”和占有该资源的“进程号”,资源分配表中记录了每个资源正在被那个进程所占有
3.设置一张进程等待分配表,每个表目包含“进程号”和该进程所等待的“资源号”。
4.死锁检测算法:当任一进程Pj申请一个已被其他进程占用的资源ri时,进行死锁检测,检测算法通过反复查找资源分配表和进程等待表,来确定进程pj对资源ri的申请是否导致形成环路,若是,则确定出现死锁。
死锁解除:
1.剥夺资源
(1)还原算法
(2)建立检查点。
2.撤销进程。