进程互斥——Peterson算法详细解析

Peterson算法:进程互斥的软件解决方案

引言(进程的同步与互斥)

首先简要的介绍进程的同步与互斥:
进程的同步:多个进程需要协同完成某一任务,在完成任务的过程中要保证多个进程工作的次序。在协同合作过程中的制约关系就是同步;
进程的互斥:由于进程对一块数据的访问与修改操作不是原子性的,所以当一块共享数据同时被多个进程访问与修改时最后的结果是不可预测(竞争条件)。即多个进程必须互斥地对一块共享数据进行修改。这块需要互斥访问的区域称为临界区
Peterson算法就是从软件层面来实现互斥访问临界区的。

Peterson算法

Peterson算法使用了一个全局的bool intereste[]数组来表示进程想要进入临界区,一个全局的int turn变量来表示当前由哪一个进程进入数组。无论在turn赋值的语句之前如何叽里咕噜的切换进程,叽里咕噜的修改interested[i] 的值,Peterson算法要确保的就是第一个修改好turn值的进程先访问临界区。 接下来我们使用p0p1两个进程来举例说明Peterson算法的运作过程。观察如下两段伪代码:

//p0
void process0()
{
    interested[0] = true;
    turn = 0;
    while(turn == 0 && interested[1] == true) {;} //在此阻塞
    //临界区
    interested[0] = false;
}
//p1
void process1()
{
    interested[1] = true;
    turn = 1;
    while(turn == 1 && interested[0] == true) {;} //在此阻塞
    //临界区
    interested[1] = false;
}

算法运作过程分析

我们以p0进程作为第一视角来说明Peterson算法的运作过程:

情况一

首先是最简单的情况:
假设p0先被调度p0修改了interested[0] = trueturn = 0直到p0进入临界区之前都没有切换到p1 ,所以当p0进行while判断时:turn == 0 && nterested[1] == false,不进入循环,p0可以直接访问临界区。然后释放interested[0],使p1可以访问临界区;

反之如果是p1先被调度p1修改interested[1] = trueturn = 1,并进入了临界区。此时如果切换到p0运行,p0修改了interestedturn,但是在循环判断时由于interested[1] 没有被释放,所以循环阻塞直到时间片用完再次切换到p1。直到interested[1] 被释放,p0的阻塞循环才被打破。

情况二

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿qiu不熬夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值