理解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进不了临界区。这一结果被称为优先级反转
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值