萌新瑟瑟发抖的 2023-09-19 20:59 采纳率: 85.3%
浏览 15

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

img


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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-19 23:13
    关注

    【以下回答由 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算法的疑惑。如果还有其他问题,请随时提问。


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

报告相同问题?

问题事件

  • 创建了问题 9月19日