Peterson互斥算法
1981年,G.L.Peterson 提出的一个简单的互斥算法。
int flag[2];//初值为0,表示进程是否在临界区内
int turn;//初值为0或1,表示当前轮流次序
P0:
do
{
flag[0]=1;
turn=1;
while (flag[1]&&turn==1);
//临界区
flag[0]=0;
//其余代码
}while(1)
P1:
do
{
flag[1]=1;
turn=0;
while (flag[0]&&turn==0);
//临界区
flag[1]=0;
//其余代码
}while(1)
多处理器系统与Peterson
Peterson算法适合单处理器系统,对于多处理器系统并不适用,因为一个进程内部顺序执行的指令,可能由于满足Bernstein条件而被并行执行,并行执行的效果可能是重排序执行的结果,比如Peterson算法中,进程
P
0
P_0
P0进入临界区之前的两条指令flag[0]=1;
turn=1;
重排序后可能顺序变为 turn=1;
flag[0]=1;
,此时将不再满足互斥性,即进程
P
0
P_0
P0和进程
P
1
P_1
P1可能同时进入临界区,原因如下。
当
P
0
P_0
P0进程执行turn=1
后时间片用尽,若此时
P
1
P_1
P1获得处理器,将直接进入临界区,若
P
1
P_1
P1进程在临界区中时间片用尽,
P
0
P_0
P0进程又重新获得处理器,则
P
0
P_0
P0进程也将进入临界区。此时不能满足互斥性。
参考文献
[1]计算机操作系统教程,第4版,左万利,王英,高等教育出版社,2019年6月