OS 基础教程

进程管理

同步

死锁

内存管理

文件管理

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/os-paterson-solution.html

帕特森(Peterson)解决方案


这是在用户模式下实现的软件机制。 这是一个繁忙的等待解决方案,只能实施两个流程。 它使用两个变量:回转变量和感兴趣变量。

解决方案的代码如下-

# 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行之后进程被抢占,那么它在下一次机会中肯定会进入临界区。

可移植性

这是完整的软件解决方案,因此它在每个硬件上都是可移植的。