死锁原因及解决、避免办法

死锁的条件
     互斥条件(Mutual exclusion)     :资源不能被共享,只能由一个进程使用。
     请求与保持条件(Hold and wait)进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放
     不可抢占条件(No pre-emption)    :有些系统资源是不可抢占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释放

     循环等待条件(Circular wait)      :若干个进程形成环形链,每个都占用对方申请的下一个资源

处理死锁的策略

1、忽略该问题。例如鸵鸟算法

 2、检测死锁并且恢复。
3、仔细地对资源进行动态分配,以避免死锁。
4、通过破除死锁四个必要条件之一,来防止死锁产生。

鸵鸟算法:

该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

银行家算法:

        所谓银行家算法,是指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配

按照银行家算法的思想,当进程请求资源时,系统将按如下原则分配系统资源:

(1) 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程。

(2) 进程可以分期请求资源,当请求的总数不能超过最大需求量。

(3) 当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能使进程在有限的时间里得到资源。

(4) 当系统现有的资源能满足进程尚需资源数时,必须测试系统现存的资源能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配。

解决死锁的策略

对待死锁的策略主要有:

(1) 死锁预防:破坏导致死锁必要条件中的任意一个就可以预防死锁。例如,要求用户申请资源时一次性申请所需要的全部资源,这就破坏了保持和等待条件;将资源分层,得到上一层资源后,才能够申请下一层资源,它破坏了环路等待条件。预防通常会降低系统的效率。

(2) 死锁避免:避免是指进程在每次申请资源时判断这些操作是否安全,例如,使用银行家算法。死锁避免算法的执行会增加系统的开销。

(3) 死锁检测:死锁预防和避免都是事前措施,而死锁的检测则是判断系统是否处于死锁状态,如果是,则执行死锁解除策略。

(4) 死锁解除:这是与死锁检测结合使用的,它使用的方式就是剥夺。即将某进程所拥有的资源强行收回,分配给其他的进程。

 

死锁的避免:
死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。
死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。
避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。方法如下:
1.如果一个进程的当前请求的资源会导致死锁,系统拒绝启动该进程;
2.如果一个资源的分配会导致下一步的死锁,系统就拒绝本次的分配;
显然要避免死锁,必须事先知道系统拥有的资源数量及其属性

### 死锁的概念 死锁是指两个或多个进程在执行过程中,由于竞争资源或者相互通信而造成的一种阻塞现象,此时所有涉及的进程都无法向前推进[^3]。具体来说,当一组进程中的每一个都在等待仅由该组进程中的其他成员所占用的资源被释放时,则认为发生了死锁。 ### 操作系统层面的解决方案 操作系统提供了多种方式来应对可能出现的死锁情况: #### 1. 死锁预防 这种方法试图破坏形成死锁的一个必要条件——持有并等待、循环等待链路、互斥使用资源非剥夺性分配。例如,可以规定任何请求新资源之前必须先放弃当前持有的全部资源,以此打破“持有并等待”的条件[^1]。 #### 2. 死锁避免 此策略是在每次分配资源前检查系统的状态是否会进入不安全区,即是否存在潜在的死锁定局面。银行家算法就是一个典型的例子,它能够预测未来的资源需求,并决定是否应该满足某个特定的任务请求以防止未来可能产生的死锁状况。 #### 3. 死锁检测与恢复 不同于上述两种主动防御的方式,这种方式允许暂时性的死锁存在,之后再通过周期性扫描发现死锁的存在并通过某种手段(如撤销部分作业)使受影响的过程恢复正常运行。对于那些未采取预防或避免措施的操作环境而言,这是唯一可行的选择[^2]。 ### 并发编程中的实践建议 为了减少并发程序中出现死锁的风险,在设计阶段就应该考虑以下几个方面: - **最小化共享资源的数量**:尽可能降低不同线程间共用的数据量。 - **合理规划获取/释放顺序**:确保所有的线程按照相同的顺序访问公共资源,这样就可以有效规避循环等待的发生。 - **设置超时机制**:给定时间内未能成功获得所需资源则自动回滚操作,从而避免无限期地处于等待状态。 ```java try { if (!lock.tryLock(5, TimeUnit.SECONDS)) { // 尝试加锁最多五秒 throw new RuntimeException("Could not acquire lock"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); // 成功拿到锁后记得解锁 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值