为什么这个Mutex解决方案不正确?

时间:2016-04-23 11:33:11

标签: mutex mutual-exclusion

有两个进程P1和P2可以进入临界区。

互斥解决方案要求:

互斥区域 - (关键部分),最多只能容纳一个进程。

没有相互阻止 - 关键部分之外的进程无法阻止其中的进程。

没有饥饿 - 对进入关键部分感兴趣的过程不必永远等待。

无争用成功 - 如果没有其他流程感兴趣,有兴趣进入关键部分的流程必须成功完成此任务。

为什么下面的代码不能解决相互排斥问题?

即。哪个要求不满足?

C1和C2初始化为1.

P1:  LOOP
        Non-Critical Section
        LOOP UNTIL C2 = 1 END_LOOP;
        C1 := 0;
        Critical Section
        C1 := 1;
END

P2:  LOOP
        Non-Critical Section
        LOOP UNTIL C1 = 1 END_LOOP;
        C2 := 0;
        Critical Section
        C2 := 1;
END

1 个答案:

答案 0 :(得分:0)

为了用最好的意图来解释这个问题,我必须假设每次读或写被认为是原子的和有序的。然后它更有意义。

您遇到的问题是每个进程中的内部循环可以独立完成。这些循环是互斥体的“等待轮到我”。

但是,该循环的终止和以下赋值(将阻止其他循环终止)不是原子的。因此,我们有以下可能的情况:

P1: exit wait loop because C2 is 1

P2: exit wait loop because C1 is 1
P2: set C2 to 0
P2: enter critical section

P1: set C1 to 0
P1: enter critical section

以上违反了有互斥区的第一个要求。导致此类违规的条件通常称为竞争条件

你也可能期望一个进程让另一个进程挨饿。在P1(等待锁定)获得一段CPU时间之前,P2有可能始终执行其关键部分并再次获取锁定。因此,控制变量C2始终为0,如P1所示。或者至少,对于不成比例的切片可能是那种方式。

P2: exit wait loop because C1 is 1
P2: set C2 to 0

P1: spin on C2 != 1 for entire time slice

P2: enter critical section
P2: set C2 to 1
P2: exit wait loop because C1 is 1
P2: set C2 to 0

P1: spin on C2 != 1 for entire time slice

P2: enter critical section
P2: set C2 to 1
P2: exit wait loop because C1 is 1
P2: set C2 to 0

P1: spin on C2 != 1 for entire time slice

...

除了在某些环境中,P1不太可能永远缺乏 。但是由于P1断言它正在等待,所以它不应该指望P2在转向之前在关键部分得到多个裂缝。

这也可能违反了“无争用成功”要求,但真的很难说。但我建议如果P2不再运行,那么考虑C2可能留在哪个状态,以及P1为什么需要知道P2。