📅  最后修改于: 2020-12-14 03:41:34             🧑  作者: Mango
这是在用户模式下实现的软件机制。这是一个繁忙的等待解决方案,只能针对两个进程实施。它使用两个变量,即转变量和感兴趣变量。
解决方案的代码如下
# 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解决方案为您提供了所有必要的要求,例如互斥,进度,有限的等待时间和可移植性。
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。入口部分和出口部分如下所示。最初,感兴趣的变量和turn变量的值为0。
最初,过程P1到达并想要进入关键部分。它将感兴趣的变量设置为True(指令行3),还将turn设置为1(行号4)。由于P1完全满足第5行中给出的条件,因此它将进入临界区。
P1 → 1 2 3 4 5 CS
同时,进程P1被抢占,进程P2被调度。 P2还希望输入关键部分并执行输入部分的指令1、2、3和4。在指令5上,由于它不满足条件(其他相关变量的值仍为true)而被卡住。因此,它进入了繁忙的等待。
P2 → 1 2 3 4 5
再次安排P1并通过执行指令no来完成关键部分。 6(将相关变量设置为false)。现在,如果P2检查,则它将满足条件,因为其他进程的关注变量变为false。 P2也将进入关键部分。
P1 → 6
P2 → 5 CS
任何过程都可能多次进入关键部分。因此,该过程以循环顺序发生。
该方法可以确保互斥。在输入部分中,while条件涉及两个变量的条件,因此一个过程不能进入关键部分,直到另一个过程感兴趣并且该过程是最后一个更新转弯变量的过程。
不感兴趣的进程将永远不会阻止其他感兴趣的进程进入关键部分。如果另一个进程也感兴趣,则该进程将等待。
感兴趣的变量机制失败,因为它没有提供有限的等待。但是,在Peterson解决方案中,永远不会发生死锁,因为首先确定转弯变量的过程肯定会进入关键部分。因此,如果在执行入口部分的第4行之后抢占了一个进程,则它肯定会在下一次机会进入关键部分。
这是完整的软件解决方案,因此可以在每种硬件上移植。