PETERSON互斥算法解析

对于互斥算法,主要有两种,一种是DEKKER算法,另一种是PETERSON算法,这一篇主要来说PETERSON算法。

相比于DEKKER算法,PETERSON算法也解决了互斥访问问题,并且不需要像DEKKER算法一样强制轮流访问,可以正常的顺序进行工作,它的原理如下:

//进程i
enter_region(i);//这个函数用于判断和决定进程i什么时候能进入临界区
临界区
leave_region(i);//出了临界区之后进行一定的操作

PETERSON算法只要是调用了两个函数enter_region(i)和leave_region(i)函数来判断什么时候这个进程能进入临界区,什么时候不能进入,以及出了临界区要做什么操作。

那么具体的两个函数我们看一下:

#define FALSE 0
#define TRUE 1
#define N 2
int turn; //用于决定轮到谁访问临界区
int interest[N];//表示哪个进程有兴趣进入临界区
void enter_region(int process){

    int other = 1 - process;//process是进程号,1-process表示另一个进程的进程号
    interest[process] = true;//表示这个进程希望进入临界区
    turn = process;
    while(turn == process && interest[other] == true);


}
//之后是访问临界区的代码

...临界区

//之后是出了临界区要进行的操作
void leave_region(int process){
    interest[process] = false;
}

那么这两个函数怎么做到互斥访问的呢?首先看enter_region函数。因为一共就两个进程,当0进程进入enter_region的时候,首先确定1进程也想进临界区。0进程吧自己的interest[0]置为true且turn = 0表示自己该进临界区了,此时被切换下CPU,1进程上。1进程同样也做了如此操作,把turn又改成了1.那么他自然而然就陷入了后面的死循环直到时间片用完。然后0进程上CPU,他发现此时turn == 1所以就没有进入死循环,直接就结束enter_region进入了临界区。然后leave_region将自己的interest[0]改成false表示自己不想再进了。 当1进程上CPU的时候因为interest[other]已经被0进程改成了false,所以也结束了死循环,开始访问临界区。

这样Peterson算法就保证了访问互斥临界区的安全性。

你可能感兴趣的:(操作系统)