理解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进不了临界区。这一结果被称为优先级反转
推荐阅读
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 画解算法(1.|画解算法:1. 两数之和)
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- SG平滑轨迹算法的原理和实现
- 深入理解|深入理解 Android 9.0 Crash 机制(二)