成因:
(1)资源竞争:
竞争不可剥夺的资源。
(2)进程推进顺序非法:
- 请求释放资源的顺序错误,P1,P2分别占有R1,R2,然后分别请求对方占有但未释放的资源。
- 信号量使用不当导致死锁,进程A等待B,进程B等待A
(3)死锁产生的必要条件:
1.互斥条件:资源只在特定时间由一个进程占有。
- 不剥夺条件:资源的主动释放
- 请求和保持条件:持有资源并提出了新的请求。就算阻塞也不释放。
- 循环等待条件:
处理方法:
- 预防死锁(一刀切): 破坏四个当中的一个条件(条件严格实现简单,但是容易造成效率降低)
限制用户申请资源的顺序
- 避免死锁(预防和检测的折中): 用某种方法防止系统进入不安全状态。(程序实现比较复杂)
请求进程运行所需资源总量信息
- 死锁的检测及解除(事后擦屁股): 强制释放资源,造成损失。
在分配阶段不采取任何措施,但提供
image.png
死锁避免:
1.系统安全状态:
系统按某种进程顺序推进,分配剩余资源,可以保证此次分配不会导致系统进入不安全状态。
image.png
按照P2,P1,P3可以避免死锁。
2. 银行家算法(预防死锁):
1)可利用资源向量Available
是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Max
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵Allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
4)需求矩阵Need。
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j]
安全性算法:
举例:
image.png
image.png
用Available矩阵去一个个带入Need矩阵,看哪个可以满足Available(3,3,2)>Need(0,1,1)
(这个就随缘了),不断更新Need还有Available矩阵,直至Need全零。
死锁解除:
- 资源剥夺法: 挂起某些死锁进程,并抢占它的资源。但应防止被挂起进程长时间得不到资源。
- 撤销进程法: 强制撤销一部分甚至杀死全部进程。
- 进程回退法:让一个进程回退到足以回避死锁的地步。进程回退时自愿释放资源而不是被剥夺。