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算法就保证了访问互斥临界区的安全性。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值