理解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先进入临界区,此时满足先到先得原则。

如果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进不了临界区。这一结果被称为优先级反转

你可能感兴趣的:(操作系统与组成原理)