P0 P1
------ -------
do { do {
flag[0] = 1; flag[1] = 1;
while(flag[1]) while(flag[0])
{ {
} }
( Critical Section ) ( Critical Section )
flag[0] = 0; flag[1] = 0;
( Remainder Section) ( Remainder Section)
} }
while(1); while(1);
我想检查上面的代码是否满足互斥,进度,死锁和有界等待?
相互排斥:它满足相互排斥。因为如果它们同时启动,它们将被困在"而#34;环。所以他们的序列必须是一个接一个。
进度:根据我的理解进展是,在检查关键部分的条件时,特定的过程应该考虑那些对关键部分感兴趣的过程,其他过程不应该可以接受。换句话说,如果有5个进程,2个对再次获得关键部分不感兴趣,则在进入关键部分时应考虑剩余的3个进程(感兴趣的)。现在,在退出P0后,从它的剩余部分开始,如果P0不想再次执行。然后P1在进入临界区时不应该考虑P0。但是这里P1,正在检查P0' s标志进入临界区。所以违反了规则。 所以没有进展。 (思考是否正确???)
死锁:如果P0和P1在开始时同时执行,那么两者都会陷入While循环,所以死锁。
有界等待:????
以上3个想法与答案不符。请指正。
答案 0 :(得分:0)
关键是读取代码,因为它是,而不是它的意思(由编写它的人)。所以这是我的解释:
它们不会互相排斥。任何中途的现代编译器都可能在第一次读取访问之前在任何点初始化变量。因此,在程序开始运行的那一刻,flag [0]和flag [1]可能都是1。
此外,标志[0]或标志[1]的设置不一定是原子的 - 并且确定地狱不能确保通知变更的过程不会超越只将标志设置为0. 如果不应同时运行余数和关键部分,则可能会出现竞争条件。
我希望这是某种类的分配 - 忙着等待循环通常是邪恶的,应该避免;有成熟的方案,如信号量,线程,可以wait()和通知()d等等,所以这是一个“在一个比我们更糟糕的世界”的代码片段。