这是在用户模式下实现的软件机制。 这是一个繁忙的等待解决方案,只能实施两个流程。 它使用两个变量:回转变量和感兴趣变量。
解决方案的代码如下-
# define N 2
# define TRUE 1
# define FALSE 0
int interested[N] = FALSE;
int turn;
voidEntry_Section (int process)
{
int other;
other = 1-process;
interested[process] = TRUE;
turn = process;
while (interested [other] =True && TURN=process);
}
voidExit_Section (int process)
{
interested [process] = FALSE;
}
到目前为止,每个解决方案都受到一个或另一个问题的影响。 但是,Peterson解决方案为您提供了所有必要的要求,例如互斥,进度,有限等待和可移植性。
Peterson解法分析
voidEntry_Section (int process)
{
1. int other;
2. other = 1-process;
3. interested[process] = TRUE;
4. turn = process;
5. while (interested [other] =True && TURN=process);
}
Critical Section
voidExit_Section (int process)
{
6. interested [process] = FALSE;
}
这是一个双进程解决方案。假设有两个合作进程:P1和P2。 入口部分和退出部分如下所示。 最初,感兴趣的变量和转向变量的值是0
。
最初进程P1到达并想要进入临界区。 它将其感兴趣的变量设置为True(指令行3),并将其设置为1(行号4)。 由于P1中给出的条件完全满足P1,所以它将进入临界区。
P1 → 1 2 3 4 5 CS
同时,进程P1被抢占,进程P2被计划。 P2也想进入临界区并执行入口部分的指令1,2,3和4。 在指令5中,由于它不满足条件(其他感兴趣的变量的值仍然为真),它被卡住了。 因此它进入了繁忙的等待状态。
P2 → 1 2 3 4 5
P1再次按计划执行,并通过执行指令编号完成临界区。 6(将感兴趣的变量设置为false)。 现在,如果P2检查,那么它将满足条件,因为其他进程的感兴趣变量变为false。 P2也将进入临界区。
P1 → 6
P2 → 5 CS
任何过程都可以在临界区输入多次。 因此,该过程按循环顺序进行。
相互排斥
该方法确实提供互斥。 在入口部分,while条件涉及两个变量的标准,因此一个进程无法进入临界区,直到另一个进程感兴趣,并且进程是最后一个更新转向变量。
进展
一个不感兴趣的进程永远不会阻止另一个感兴趣的进程进入临界区。 如果另一个进程也有兴趣,那么这个进程将会等待。
有限的等待
感兴趣的变量机制失败了,因为它没有提供有限的等待。 但是,在Peterson解决方案中,死锁永远不会发生,因为首先设置转向变量的进程肯定会进入临界区。 因此,如果在执行入口部分的第4行之后进程被抢占,那么它在下一次机会中肯定会进入临界区。
可移植性
这是完整的软件解决方案,因此它在每个硬件上都是可移植的。