今天上课一同学正在准备计算机四级,拿过来看了看,无意中看到死锁问题,联想到数据库中也有死锁问题。于是查阅网上资料,搜了一下计算机中说的死锁问题。了解到一些
4.8 死锁问题(Deadlock)
各进程在使用系统资源时,应注意系统产生死锁问题。下面先介绍什么是死锁。
4.8.1死锁的概念
1. 死锁的定义
所谓死锁,是指各并发进程彼此互相等待对方所拥有的资源,且这些并发进程在得到对方的资源之前不会释放自己所拥有的资源。从而造成大家都想得到资源而又都得不到资源,各并发进程不能继续向前推进的状态。
2. 死锁的起因
死锁发生原因:死锁的起因是并发进程的资源竞争。产生死锁的根本原因在于系统提供的资源个数少于并发进程所要求的该类资源数。显然,由于资源的有限性,我们不可能为所有要求资源的进程无限制地提供资源。但是,我们可以采用适当的资源分配算法,以达到消除死锁的目的。
3. 产生死锁的必要条件
只有4个条件都满足时,才会出现死锁。
(1)互斥条件:并发进程所要求和占有的资源是不能同时被两个以上进程使用或操作的,进程对它所需要的资源进行排它性控制。
(2)不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其它进程强行剥夺,而只能由获得该资源的进程自己释放。
(3)部分分配:进程每次申请它所需要的一部分资源,在等待新资源的同时,继续占用已分配到的资源。
(4)环路条件:存在一种进程循环链,链中每一个进程已获得的资源同时被下一个进程所请求。
4.8.2 死锁的排除方法
处理死锁的基本方法可归结为以下3种:
方法 |
资源分配策略 |
各种可能模式 |
主要优点 |
主要缺点 |
预防 Prevention |
保守的;宁可资源闲置 |
一次请求所有资源<条件1> 资源剥夺 <条件3> 资源按序申请 <条件4> |
适用于作突发式处理的进程;不必剥夺 适用于状态可以保存和恢复的资源 可以在编译时(而不必在运行时)就进行检查 |
效率低;进程初始化时间延长 剥夺次数过多;多次对资源重新起动 不便灵活申请新资源 |
避免 Avoidance |
是“预防”和“检测”的折衷(在运行时判断是否可能死锁) |
寻找可能的安全的运行顺序 |
不必进行剥夺 |
必须知道将来的资源需求;进程可能会长时间阻塞 |
检测 Detection |
宽松的;只要允许,就分配资源 |
定期检查死锁是否已经发生 |
不延长进程初始化时间;允许对死锁进行现场处理 |
通过剥夺解除死锁,造成损失 |
1. 死锁的预防
死锁的预防:是采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。
预防死锁的三种策略:
打破死锁资源的互斥和不可剥夺这两个条件
缺点:不能解决访问那些不允许被同时访问的资源时所带来的死锁问题。
打破资源的部分分配这个死锁产生的必要条件
缺点:在许多情况下,一个进程在执行之前不可能提出它所需要的全部资源。
无论所需资源何时用到,一个进程只有在所有要求资源都得到满足后才开始执行。
对于那些不经常使用的资源,进程在生存过程期间一直占用它们是一种极大的浪费。
降低了进程的并发性。
打破死锁的环路条件
缺点:限制了进程对资源的请求,而且对资源的分类编序也耗去一定的系统开销。
2. 死锁的避免
死锁的避免:在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。
在分配资源时判断是否会出现死锁,如不会死锁,则分配资源。
死锁避免的一种基本模式是把进程分为多个步,其中每个步所使用的资源是固定的,且在一个步内,进程所保持的资源数不变。即进程的资源请求、使用与释放要依靠不同的步完成。
3. 死锁的检测和恢复
保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。
死锁检测算法主要是检查是否有循环等待。