理解Peterson算法

先上算法代码:

int turn; int interested[2]; void enter_region(int process)//在进入临界区前调用 { int other = 1 - process; interested[process] = true; turn = process; while ( turn == process && interested[other] == true); }void leave_region(int process)//在进入临界区后调用 { interested[process] = false; }

我们考虑两个进程P0,P1, 假设P0,P1都想进入临界区(即interested = true)。直接考虑P0马上要处理的代码是最后的while循环,在这之前无所谓P1是否已经在临界区,因为P0还没有进入临界区。
如果turn = 0,则P1应该是只运行到turn行之前,或者更简单P1不想进入临界区。 此时如果P1处于interested行前,则P0直接跳出循环进入临界区。这种情况下,P1不可能进入临界区(因为此时interested[0] = true)。如果P1执行了interested行,则P0先循环等待P1执行turn行,然后跳出循环进入临界区(因为此时turn = 1,不满足循环条件)。P0先turn,所以P0先进入临界区,此时满足先到先得原则。
【理解Peterson算法】如果turn = 1,说明P0运行到turn = 0的代码后马上切换到P1,并运行到turn = 1的代码后。注意此时P1不可能进入临界区,因为interested[0]= true。因此P0可以安全的进入临界区,并且此后P1无法进入知道P0退出后令interested[0]为false。
  • 这一算法在进程是抢占式的并且有优先级的时候会发生死锁。例如有两个进程H,L,当L处于临界区而H想进入时,由于H优先级高,在H忙碌时会一直执行H。于是L离不开临界区,H进不了临界区。这一结果被称为优先级反转

    推荐阅读