死锁的避免和预防

产生死锁的原因主要是:

1.系统资源不足, 

2.进程运行推进的顺序不合适,            

3.资源分配不当

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。 
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
(3) 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。 
(4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

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

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

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

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


鸵鸟算法:

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

银行家算法:

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

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

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

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

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

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



### 死锁预防死锁避免的概念及主要区别 #### 概念定义 - **死锁预防**是一种静态策略,通过破坏死锁产生的四个必要条件之一(互斥条件、请求保持条件、不剥夺条件或循环等待条件),确保系统永远不会进入死锁状态[^2]。这种方法通常在系统设计阶段实现,通过预先设定资源分配算法来消除死锁的可能性。 - **死锁避免**是一种动态策略,在资源分配时进行安全性检查,以确保系统的资源分配不会导致死锁。如果某个资源分配会导致系统进入不安全状态,则该分配会被拒绝。银行家算法是典型的死锁避免方法[^1]。 #### 主要区别 | 区别点 | 死锁预防 | 死锁避免 | |----------------|---------------------------------------------|---------------------------------------------| | **策略类型** | 静态策略 | 动态策略 | | **实现方式** | 破坏死锁的四个必要条件之一 | 在每次资源分配前进行安全性检查 | | **执行时机** | 系统设计阶段,提前确定资源分配规则 | 资源分配运行时,实时检测 | | **资源利用率** | 较低,因为某些资源可能被限制使用 | 较高,允许更多灵活的资源分配 | | **复杂性** | 简单,但可能导致资源浪费 | 复杂,需要实时计算安全性 | | **安全性** | 安全可靠,完全避免死锁 | 安全可靠,但在某些情况下可能无法分配资源 | #### 示例代码:银行家算法(死锁避免) 以下是一个简单的银行家算法实现示例,用于演示如何在资源分配中避免死锁: ```python def is_safe(state, available, max_claim, allocation): need = max_claim - allocation work = available.copy() finish = [False] * len(state) for i in range(len(state)): if not finish[i] and (need[i] <= work).all(): work += allocation[i] finish[i] = True i = -1 # Restart the loop return all(finish) # 示例输入 state = ['P0', 'P1', 'P2'] available = [3, 3, 2] max_claim = [[7, 5, 3], [3, 2, 2], [9, 0, 2]] allocation = [[0, 1, 0], [2, 0, 0], [3, 0, 2]] if is_safe(state, available, max_claim, allocation): print("系统处于安全状态") else: print("系统可能进入死锁状态") ``` #### 总结 死锁预防死锁避免虽然都旨在防止死锁的发生,但它们的实现方式适用场景有所不同。死锁预防是一种静态方法,简单可靠但可能导致资源利用率低下;而死锁避免是一种动态方法,能够更高效地利用资源,但实现起来更加复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值