【以下回答由 GPT 生成】
Peterson算法是一种经典的解决进程互斥问题的算法。它是基于共享内存的多进程情况下的互斥访问临界资源的算法。
在Peterson算法中,有两个进程(通常称为进程0和进程1)共享一个turn变量,通过该变量来确定哪个进程有权访问临界资源。每个进程中都会有一个flag变量,用来表示该进程是否要进入临界区。具体的解释如下:
int turn;
bool flag[2] = {false, false};
进程0的lock函数示例:
void lock0() {
flag[0] = true; // 进程0希望进入临界区
turn = 1; // 设置turn为1,让进程1有机会进入临界区
while (flag[1] && turn == 1) {
// 进程1希望进入临界区且轮到进程1了,进程0等待
// 进程1进入临界区后会设flag[0]为false,或者轮到进程0了
}
}
void unlock0() {
flag[0] = false; // 进程0离开临界区
}
进程1的lock函数示例:
void lock1() {
flag[1] = true; // 进程1希望进入临界区
turn = 0; // 设置turn为0,让进程0有机会进入临界区
while (flag[0] && turn == 0) {
// 进程0希望进入临界区且轮到进程0了,进程1等待
// 进程0进入临界区后会设flag[1]为false,或者轮到进程1了
}
}
void unlock1() {
flag[1] = false; // 进程1离开临界区
}
两个进程调用这两个函数可以实现互斥访问临界资源,通过flag和turn的设置,进程会在进入临界区之前进行等待,以避免同时访问临界资源。
回答你的疑问,虽然不同的进程有各自的地址空间,但它们共享的是相同的代码段和数据段。因此,它们可以通过共享的内存空间来交换信息和共享变量。在Peterson算法中,就是通过共享的turn和flag变量来实现两个进程之间的同步操作。
所以,虽然进程0和进程1有各自的turn变量,但它们的turn变量是存储在共享内存中的相同地址上的变量。因此,一个进程对turn变量的更改会影响到另一个进程中对turn变量的访问。这就是为什么它们相互影响的原因。
希望这个解释能够解决你对Peterson算法的疑惑。如果还有其他问题,请随时提问。