Peterson算法详解
引言(进程的同步与互斥)
首先简要的介绍进程的同步与互斥:
进程的同步:多个进程需要协同完成某一任务,在完成任务的过程中要保证多个进程工作的次序。在协同合作过程中的制约关系就是同步;
进程的互斥:由于进程对一块数据的访问与修改操作不是原子性的,所以当一块共享数据同时被多个进程访问与修改时最后的结果是不可预测(竞争条件)。即多个进程必须互斥地对一块共享数据进行修改。这块需要互斥访问的区域称为临界区。
Peterson算法就是从软件层面来实现互斥访问临界区的。
Peterson算法
Peterson算法使用了一个全局的bool intereste[]数组来表示进程想要进入临界区,一个全局的int turn变量来表示当前由哪一个进程进入数组。无论在turn赋值的语句之前如何叽里咕噜的切换进程,叽里咕噜的修改interested[i] 的值,Peterson算法要确保的就是第一个修改好turn值的进程先访问临界区。 接下来我们使用p0与p1两个进程来举例说明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] = true,turn = 0。直到p0进入临界区之前都没有切换到p1 ,所以当p0进行while判断时:turn == 0 && nterested[1] == false,不进入循环,p0可以直接访问临界区。然后释放interested[0],使p1可以访问临界区;
反之如果是p1先被调度,p1修改interested[1] = true与turn = 1,并进入了临界区。此时如果切换到p0运行,p0修改了interested与turn,但是在循环判断时由于interested[1] 没有被释放,所以循环阻塞直到时间片用完再次切换到p1。直到interested[1] 被释放,p0的阻塞循环才被打破。
情况二
Peterson算法:进程互斥的软件解决方案

最低0.47元/天 解锁文章
29

被折叠的 条评论
为什么被折叠?



