我已经开始学习关键部分问题及其各种解决方案。为了解释我的问题,让我先简要介绍一下它的背景。
关键部分问题算法1的两个过程解决方案的一般结构为:
turn = 0;
do
{
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
此算法的问题在于它不支持Progress的必要要求。它强制关键部分由P0-> P1-> P0-> P1->等分拥有。
为了解决这个问题,使用算法2,其中变量转弯被数组flag[]
取代。算法2的一般结构为:
do
{
flag[0] = T ;
while (flag[1]);//if flag[1] is true wait indefinitely
// critical section of Process P0
flag [0] = F; //P0 indicated it no longer needs to be in critical section
//remainder section
} while (1); //loop again
在这里,进程可以根据需要重复执行其关键部分。 (尽管该算法也不支持进度)
现在我的问题是,为什么我们不能像在算法2中使用变量flag[]
一样,在算法1中的do-while循环中使用变量turn?下面的代码将解释我的意思:
对于进程0:
do
{
turn = 0;
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
对于过程1:
do
{
turn = 1;
while (turn != 1) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 0; //after P1 leaves critical section, lets P0 in
//remainder section
} while (1); //loop again
如果需要,上述代码是否不允许进程重复执行其关键部分,从而解决算法1中的问题? 我知道这里有问题,否则此解决方案将被广泛使用,不完全知道它是什么。
答案 0 :(得分:0)
关键部分不再受保护。在任意调度序列中有一个(一行=在这段时间内由进程X独占执行):
process action contents of 'turn' critical section entered (by process)
0 "turn = 1;" 1 no
0 "} while(1);" 1 no
1 "while (turn != 1);" 1 no
1 "// critical section P1" 1 yes (1)
0 "do{" 1 yes (1)
0 "turn = 0;" 0 yes (1)
0 "while (turn != 0);" 0 yes (1)
0 "// critical section P0" 0 collision!