死锁问题(OS相关)

时间:2012-06-13 04:19:08

标签: resources deadlock

考虑具有五个单独资源名称R1的计算机。 R5。让五个过程P1,.... P5按顺序发出请求,如下:

i. P1 requests R2
ii. P4 requests R3
iii. P3 requests R1
iv. P2 requests R4
v. P5 requests R5
vi. P4 requests R2
vii. P5 requests R3
viii. P3 requests R5

如果R_i当前可用,假设进程P_i得到R_i。

是否存在死锁,如果发生这种情况,它会在什么时候发生以及涉及哪些流程?

任何人都可以帮帮我吗?对于第一个我认为没有僵局,但我不确定如何证明。

谢谢!

1 个答案:

答案 0 :(得分:0)

假设这是事件的实际序列,那里没有死锁。最初,所有资源都是免费的,按顺序运行该代码:

1. P1 requests R2: p1 has r2.
2. P4 requests R3: p4 has r3.
3. P3 requests R1: p3 has r1.
4. P2 requests R4: p2 has r4.
5. P5 requests R5: p5 has r5.
6. P4 requests R2: p4 has r3, awaiting r2(p1).
7. P5 requests R3: p5 has r5, awaiting r3(p4).
8. P3 requests R5: p3 has r1, awaiting r5(p5).

所以目前的状态是:

p1 has r2.
p2 has r4.
p3 has r1, awaiting r5(p5).
p4 has r3, awaiting r2(p1).
p5 has r5, awaiting r3(p4).

和等待链是(服务员 - >阻止者):

p4 -> p1, p5 -> p4, p3 -> p5

或:

p3 -> p5 -> p4 -> p1

因为那里没有循环,所以没有发生死锁。

只需让非服务员释放他们的资源并遵循一系列事件即可获得进一步的证据:

 9. p1 releases r2, frees it up for p4 (p3 and p5 blocked, p4 has r3/r2).
10. p4 releases r3, frees it up for p5 (p3 blocked, p5 has r5/r3).
11. p5 releases r5, frees it up for p3 (nobody is blocked, p3 has r5).

这些步骤之后的最终状态是:

p1 has nothing.
p2 has r4.
p3 has r1/r5.
p4 has r2.
p5 has r3.

现在没有阻塞,每个线程都可以简单地释放他们仍然分配的任何资源。


现在,如果这些操作可能以任何顺序发生(同时保持每个线程内的顺序),你是否要扩展你的问题以询问是否可能出现死锁,答案仍然是否定的。

这是多线程的基本原则,您可以通过确保在每个线程中以相同的顺序分配所有资源来避免死锁。根据您提供的操作,各个线程按如下方式分配其资源(必须在线程内维护):

P1: R2
P2: R4
P3: R1 R5
P4: R3 R2
P5: R5 R3

那么,我们怎样才能确保它们都以相同的顺序分配?我们只需要找到匹配的序列。首先,我们从上面的列表开始,但添加空格,以便排列相同的资源,并且另一个资源的两边都没有资源:

P1:             R2
P2: R4
P3:    R1 R5
P4:          R3 R2
P5:       R5 R3

    R4 R1 R5 R3 R2  <==

这是你的顺序。 每个线程都按照顺序4,1,5,3,2分配资源。并非每个线程都分配所有资源,但这与此无关。

这也不是唯一的解决方案(R4是独立的,所以它可以在列表中任何地方 - 所有其他资源都涉及单个依赖关系链(1,5,3,2)所以他们的相对位置是固定的。)

但是,证明每个线程都按特定顺序分配资源就足够了,因此死锁是不可能的。