文章目录
1. The Deadlock Problem
2. System Model
资源类型(resource type):
R
1
,
R
2
,
.
.
.
,
R
m
R_1,R_2,...,R_m
R1,R2,...,Rm
例如CPU cycle,内存空间,IO设备
认为每个资源类型Ri拥有Wi数量的实例,这些实例被process利用
每个进程使用一系列的protocol利用这些资源类型的实例:
- request
- use
- release
3. Deadlock Characterization
如果以下情况同时发生,死锁就有可能出现
- Mutual exclusion:对某种资源,在同一时间只有1个进程能够对它进行使用(同时刻的互斥性)。
- hold and wait:一个至少持有1个资源的进程在等待其他进程所持有的的更多的资源
- no preemption:除非进程完成工作并且主动释放资源,否则资源不会被释放
- circular wait:在系统中存在一个环形回路集合:{P0,P1,…Pn},其中P0等P1,P1等P2,…Pn却在等P0.
Resource-Allocation Graph(资源分配图)
有两种类型的节点:
- process:用圆表示
- resource:用方块表示,方块内的小方块表示资源的instance
两种边:
进程指向资源的边表示进程要请求这个资源,资源指向进程的边表示这个进程占有这个资源(的实例)
实例:
此处没有死锁
有死锁的情况
有cycle但没有死锁(没有hold and wait)
从这个例子中也能看出来,每个resource的instance是通用的
所以可发现:
有cycle是有死锁的必要不充分条件。要视资源的instance情况而定
4. Methods for Handling Deadlocks
可选的几条策略:
- 防止死锁情况发生
- 允许系统进入死锁情况,但是可以让这种情况恢复正常
- 无视死锁情况,假装死锁从未发生(但却是在操作系统最常用的策略)
5. Deadlock Prevention
对应四种情况的策略:
- Mutual Exclusion:只有非共享资源才hold
- Hold and Wait的解决方法:必须保证党进程请求资源时,它不持有其他任何资源。但这会导致资源的利用率大幅降低,不可取
- No preemption:允许中断
Circular wait:给所有资源编号,而每个进程只能从小到大申请资源
6. Deadlock Avoidance
需要系统添加 priori(先验) 的信息
- 简单却最有用:每个进程事先申报一下它每种资源使用的最大数量
Safe State
老师的解释:系统的进程队列存在一种确定的排列方式,这样他们可以使用可用的资源而全部完成
重要的推论
- 如果系统能够进入safe state => 必然没有deadlock
- 如果系统处于unsafe state => 有可能出现deadlock
- avoidance的目的就是防止系统进入unsafe state。
图示:
avoidance algorithm
分single和multiple instance
Resource-allocation Graph Scheme
- 添加了Claim edge:如果Pj可能会请求Rj,那么画一条虚线:Pi → Rj
- 如果确实请求了,Claim edge就变成了实线的Request edge
例子:
处于unsafe state的 RAG:
对应的算法见ppt
Banker`s Algorithm
前提条件:
- multiple instances
- 每个process必须提供一个先验的最大使用量
- 当进程请求资源时,它可能需要等待
- 当进程获得了它的所有所需资源后,它必须在有限时间内归还
数据类型:
前提:线程数量为n,资源种类的数量为m
- Available:长度为m的数组,每个分量代表对应的资源的可用实例数量,应当注意这是在当前状况开始时的情况,而不是分配资源前的情况
- Max:大小为 n × m n\times m n×m的矩阵,其中 M a x [ i , j ] = k Max[i,j]=k Max[i,j]=k代表进程Pi最多可能使用k个资源Rj的实例(这一信息通过之前提到的先验信息提供)
- Allocation:大小为 n × m n\times m n×m的矩阵,指定当前已经为Pi分配的Rj资源的实例数
- Need:大小为 n × m n\times m n×m的矩阵,指定某个进程Pi可能需要Rj的实例数
显然有如下关系: N e e d [ i , j ] = M a x [ i , j ] − A l l o c a t i o n [ i , j ] Need[i,j] = Max[i,j]-Allocation[i,j] Need[i,j]=Max[i,j]−Allocation[i,j]
算法主体(安全性算法):
- 安全性算法中的一些定义
- 令Work为长度为m的向量,初始化为Available,用于衡量某个工作状态下正被使用的资源实例数;
- 令Finish为长度为n的向量,初始化为false,用于指示进程是否完成资源的使用
- 找到一个满足如下条件的i:(其中b的含义是need的第i行的行向量每一个分量都大于等于Work)
( a ) F i n i s h [ i ] = f a l s e ( b ) N e e d i ≤ W o r k (a) Finish[i]=false\\(b)Need_i\leq Work (a)Finish[i]=false(b)Needi≤Work
如果无法找到一个这样的i,则跳转到第四步 - 取第二步得到的i,令:
W o r k = W o r k + A l l o c a t i o n i Work= Work+Allocation_i Work=Work+Allocationi
F i n i s h [ i ] = t r u e Finish[i]=true Finish[i]=true
可以看到,这样的调度实际上是一次性尽最大可能配给一个进程它所需要的资源,之后这个进程就可以释放其已经申请的资源
在这一步过后,返回第二步 - 如果所有的Finish都已经为true,那么系统已经进入了安全状态,否则即存在不安全状态
详细内容见ppt
ppt末的两个习题答案都是否定
7. Deadlock Detection
使用这样的策略
- 允许系统进入deadlock state
wait for graph
只剩下进程
资源类型实例
检测算法