关键部分问题的两种处理方法-算法1

时间:2019-01-30 04:47:48

标签: process operating-system synchronization thread-synchronization safety-critical

我已经开始学习关键部分问题及其各种解决方案。为了解释我的问题,让我先简要介绍一下它的背景。

关键部分问题算法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中的问题? 我知道这里有问题,否则此解决方案将被广泛使用,不完全知道它是什么。

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!