我们都知道在多线程中,死锁是一个很严重的问题。产生死锁的四个必要条件:
出现死锁的条件:
1、互斥条件: 资源每次只能是一个线程使用------资源
2、请求与保持条件:一个线程因请求资源而阻塞时,对已获取的资源保持不释放。------线程
3、不可剥夺条件:线程已获取的资源,在未使用之前,不能强行剥夺,只能在使用完时由自己释放。
4、循环等待条件:若干线程之间形成一种头尾相连接的循环等待资源关系。
那么当出现死锁的时候,我们的程序就会停滞,所以死锁问题改怎么处理呢?
死锁的预防:(破坏四个必要条件)
1、资源一次性分配(破坏请求保持条件)
2、可剥夺资源:线程未满足条件时,释放掉已经占用的资源
3、资源有序分配:系统赋予每类资源一个编号,每个线程按编号递增的顺序请求资源释放则相反
死锁的避免(银行家算法):
在死锁的避免中,银行家算法算是十分常用的技巧。
先解释一下什么是银行家算法:进程首次申请资源时,测试该进程对资源的最大需求量。若当前系统现存资源可以满足,就按申请量分配资源,否则就延时分配。进程执行中继续申请资源时,测试该进程已占用的资源数域本次申请资源数的和十艘超过了改进程对资源的最大需求量。超过就拒绝分配,没有超过且系统甚于满足就直接分配,否则也要延时分配。
eg:
5个进程从p0到p4
3个资源类型A(10个实例),B(5个实例),C(7个实例)
具体输入如下表:
在T0时刻
Available表示每类资源可用的数量。;Allocation表示当前分给每个进程的资源数目;Max表示每个进程对资源的最大需求
初始时:
Work:= Available ; Need:=Max-Allocation
套用公式求得:
然后再将其余求解:
算法的结果为 <P1,P3,P4,P0,P2>
死锁的避免之银行家算法
最新推荐文章于 2022-11-24 11:47:55 发布