【发布时间】:2018-08-11 15:20:07
【问题描述】:
我有一个关于此设置会发生什么的理论问题。如果我有以下设置,这是死锁还是会发生什么?
我们在 fifo 队列中按顺序排列了三个进程 I、A 和 B。进程 I 初始化这些 Mutex 和变量并终止:
global int i = 1;
global mutex a = false;
global mutex b = true;
然后使用以下代码激活进程 A(队列中的下一个):
while(i < 4) {
down(a)
i = i / 2 + 2
up(b)
}
因此循环将开始并且进程 A 将被锁定,因为互斥锁 a 不是免费的。因此它将从运行队列中移除并进入睡眠状态(并插入到 a 的队列中)。现在进程 B 使用以下代码激活:
while(i < 4) {
down(b)
i = i + 1
up(a)
}
所以此时 b 没有被锁定,所以 B 进入,i 现在是 2。然后 B 解锁 a,它在我们的进程队列中排队进程 A,但 a 仍然被锁定为a 的队列在解锁之前不是空的? 如果是这样的话,B 会再次点击 down(b) 并锁定自己无法执行? b 会在自己的队列中记住 B 并让 B 进入睡眠状态。但是现在A当然可以再次执行,但会在a仍被锁定时命中down(a)?因此两个进程都超出了进程队列而不再运行?
这有点像我从我们的信息学讲座中了解到的,但这是真的吗?这些进程必须等待外部进程最终解锁权限?
【问题讨论】: