如何避免死锁(死锁检测算法) —— 银行家算法

一,死锁概念

死锁指的是两个或两个以上的进程在对临界资源竞争或者通信过程中, 因为某些处理不当,而造成各个进程彼此等待,无法继续向下推进,此使系统处于死锁状态, 这些互相等待的进程成为死锁进程。

二,死锁产生必要条件

1. 互斥条件

指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进 程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

2. 请求和保持条件

指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程 阻塞,但又对自己已获得的其它资源保持不放。

3. 不剥夺条件

指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

4. 环路等待条件

指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正 在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

三,死锁避免

破坏死锁产生的必要条件就可以避免、预防和解除死锁。

在系统设计、进程调度等方面注意如何能够不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源

在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配 。

因此,对资源的分配要给予合理的规划。

换句话说,避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。

四,银行家算法

操作系统按照银行家制定的规则为进程分配资源。

进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

例:有5个进程{P1,P2,P3,P4,P5} 。4类资源{R1,R2,R3,R4} 各自数量为6、3、4、2
T0时刻各进程分配资源情况如下

在这里插入图片描述

T0时刻为安全状态,存在安全序列{P4,P1,P2,P3,P5} 如下:
在这里插入图片描述
银行家算法需要在进程运行前就知道其所需资源的最大值,且进程数也通常不是固定的,因此使用有限,但从思想上可以提供了解,可以转换地应用在其他地方

案例分析
M=3种类型的资源(A,B,C,) 进程个数n=5 Available=(2,3,3);
已分配资源数 资源需求量
A B C A B C
P1 2 1 2 3 4 7
P2 4 0 2 1 3 4
P3 3 0 5 0 0 3
P4 2 0 4 2 2 1
P5 3 1 4 1 1 0
请求序列如下:
a:进程P2请求资源(0,3,4)
b:进程P4请求资源(1,0,1)
c:进程P1请求资源(2,0,1)
d:进程P3请求资源(0,0,2)

#include<iostream>
#include<string>
using namespace std;
#define n 5
#define m 3
int available[m] = {
    2,3,3 }, alloc[n][m], need[n][m], request[n][m];
void init()
{
   
	alloc[0][0] = 2;  alloc[0][1] = 1;  alloc[0][2] = 2;
	alloc[1][0] = 4;  alloc[1][1] = 0;  alloc[1][2] = 2;
	alloc[2][0] = 3;  alloc[2][1] = 0;  alloc[2][2] = 5;
	alloc[3][0] = 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以采取以下几种方法来避免死锁的发生: 1. 避免循环等待:确保线程获取锁的顺序是一致的,避免出现循环等待的情况。可以通过对锁进行排序,按照相同的顺序获取锁,从而避免循环等待。 2. 设置超时时间:在获取锁的时候设置一个超时时间,如果在规定时间内无法获取到锁,就放弃获取锁,避免长时间等待导致死锁。 3. 使用tryLock()方法:在获取锁的时候使用tryLock()方法,该方法会尝试获取锁,如果获取成功则继续执行,如果获取失败则立即释放锁,避免长时间等待。 4. 使用Lock对象:使用Lock对象代替synchronized关键字来进行锁的管理,Lock对象提供了更灵活的锁操作,可以使用tryLock()方法和lockInterruptibly()方法来避免死锁。 5. 使用线程池:使用线程池来管理线程的创建和销毁,避免频繁地创建和销毁线程,从而减少死锁的可能性。 总之,避免死锁的关键是合理设计锁的获取顺序,并且避免长时间等待和循环等待的情况发生。以上是一些常见的方法,但具体的避免死锁的策略还需要根据具体的场景和需求来确定。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [Java开发之——线程面试篇:死锁和如何避免死锁?](https://blog.csdn.net/weixin_43802541/article/details/122479319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值