关于操作系统Peterson算法的疑惑

img


上面图片左面是Peterson算法解决进程互斥问题,但我有一个疑惑,这两个不同进程不应该拥有各自的地址空间吗,所以像他们的turn变量虽然同名但是不该位于不同的内存空间吗,那为什么一个进程turn变量的改变会影响另外一个进程的turn变量呢?是因为这是算法是一个单独的程序,在访问临界资源时会调用这个程序,还是因为这两个进程是同一个程序创建的,所以共享同一块内存空间呢(我猜的)

【以下回答由 GPT 生成】

Peterson算法是一种经典的解决进程互斥问题的算法。它是基于共享内存的多进程情况下的互斥访问临界资源的算法。

在Peterson算法中,有两个进程(通常称为进程0和进程1)共享一个turn变量,通过该变量来确定哪个进程有权访问临界资源。每个进程中都会有一个flag变量,用来表示该进程是否要进入临界区。具体的解释如下:

  1. 定义一个全局的turn变量,用于确定哪个进程有权访问临界资源。
int turn;
  1. 定义两个全局的flag变量,分别表示进程0和进程1是否要进入临界区。
bool flag[2] = {false, false};
  1. 进程0和进程1分别调用互斥操作的函数(一般为lock和unlock函数)。

进程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算法的疑惑。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^