有两个进程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
答案 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。