2.4.4 死锁的处理策略—死锁的检测与解除
约 32 分钟
新困难:多实例资源图有环只是必要线索,要看能否释放足够实例
资源A、B各有2个实例,当前 Available=[0,0]。分配为 P0=[1,0]、P1=[0,1]、P2=[1,1];尚待请求 P0=[0,1]、P1=[1,0]、P2=[0,0]。P0与P1形成表面循环等待,但P2无需更多资源即可结束并释放,系统并未死锁。
def detect_deadlock(available,allocation,request):
work=available[:]; finish=[sum(a)==0 for a in allocation]; order=[]
changed=True
while changed:
changed=False
for i in range(len(allocation)):
if not finish[i] and all(request[i][j]<=work[j] for j in range(len(work))):
work=[work[j]+allocation[i][j] for j in range(len(work))]
finish[i]=True; order.append(i); changed=True
return [i for i,done in enumerate(finish) if not done],order,work
available=[0,0]
allocation=[[1,0],[0,1],[1,1]]
request=[[0,1],[1,0],[0,0]]
dead,order,work=detect_deadlock(available,allocation,request)
assert dead==[] and order==[2,0,1] and work==[2,2]
dead2,order2,_=detect_deadlock(available,allocation,[[0,1],[1,0],[1,0]])
assert dead2==[0,1,2] and order2==[]
陪推:Work初值00,只有P2的Request=00可满足;假定P2完成,Work加其Allocation变11。此时P0可获B并完成,释放A后Work变21;P1也可完成,最终22。变式把P2请求改为10后,初始没有任何进程请求可满足,算法无法前进,三者均在死锁集合。
依据:检测算法每次寻找“剩余请求不超过当前可用”的进程,假定其完成并回收已分配资源。Work只增不减;被标记完成者存在一条可行结束次序。停住时未完成进程彼此等待无法由集合外资源解除,因此构成死锁集合。单实例资源图中环可充要,多实例时仅见环不充分。
朴素检测时间 O(P²R)、空间 O(P+R)。错误反馈:Request是当前尚待请求,不是最大需求;能完成后释放的是Allocation;有环不能忽略资源实例数;安全性预防与事后死锁检测的输入含义不同;四必要条件同时成立也不等于某个具体状态必已死锁。
迁移答案:若初始Available改为 [0,1],P0可先完成,同样无死锁;增加一个资源实例可能打破等待,但应重新跑状态序列而不是只看总量。
桥接:资源状态按向量推进;下一课把虚拟地址按位切成目录、页表与页内偏移,逐级读取表项完成映射。
小纸条
学完《2.4.4 死锁的处理策略—死锁的检测与解除》后,请独立复现本课的核心状态变化或计算过程。
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。