📜  门| GATE-CS-2007 |问题20(1)

📅  最后修改于: 2023-12-03 15:12:41.845000             🧑  作者: Mango

门| GATE-CS-2007 |问题20

这道问题出自于计算机科学与工程门类的GATE-CS-2007考试,涉及到操作系统的进程同步问题。题目描述如下:

在一个系统中,有两个进程P1和P2。以下是它们使用的函数:

P1(){
    while(true){
        wait(S1);
        wait(lock);
        //临界区1

        signal(lock);
        signal(S2);
    }
}

P2(){
    while(true){
        wait(S2);
        wait(lock);
        //临界区2

        signal(lock);
        signal(S1);
    }
}

其中lock、S1、S2都表示信号量。现在有4个这样的进程,分别是P1、P1'、P2、P2'。P1和P1'共享S1信号量,P2和P2'共享S2信号量。因此,这四个进程总共有两个共享资源。可以使用以下的信号量值:

S1 = 1
S2 = 1
lock = 1

请给出一个能够工作的程序代码,保证临界区1和临界区2不会同时执行。(提示:可能需要增加其他信号量来实现)

分析

首先来看两个进程的等待和信号量操作流程:

P1 等待 S1,P2 等待 S2。

同时,P1 和 P2 等待共享锁 lock。

临界区1 操作完成后,P1 释放 lock,唤醒P2,P1 等待 S1。

临界区2 操作完成后,P2 释放 lock,唤醒P1,P2 等待 S2。

但是,考虑到 P1 和 P1' 是同一个进程,P2 和 P2' 是同一个进程,我们需要给它们增加额外的信号量来避免互相影响,即:

P1 和 P1' 互相等待 S3,表示此时只有 P1 或 P1' 能够进入临界区1。

P2 和 P2' 互相等待 S4,表示此时只有 P2 或 P2' 能够进入临界区2。

因此,我们需要修改代码如下:

S1 = 1
S2 = 1
S3 = 1
S4 = 1
lock = 1

P1(){
    while(true){
        wait(S1);
        wait(lock);
        wait(S3);
        //临界区1

        signal(lock);
        signal(S2);
        signal(S4);
    }
}

P1'(){
    while(true){
        wait(S1);
        wait(lock);
        wait(S3);
        //临界区1'

        signal(lock);
        signal(S2);
        signal(S4);
    }
}

P2(){
    while(true){
        wait(S2);
        wait(lock);
        wait(S4);
        //临界区2

        signal(lock);
        signal(S1);
        signal(S3);
    }
}

P2'(){
    while(true){
        wait(S2);
        wait(lock);
        wait(S4);
        //临界区2'

        signal(lock);
        signal(S1);
        signal(S3);
    }
}
结论

本题考查了进程同步和信号量的相关知识。需要加深对这类问题的理解和思考,掌握信号量与进程同步之间的关系。

代码片段如下:

    S1 = 1
    S2 = 1
    S3 = 1
    S4 = 1
    lock = 1

    P1(){
        while(true){
            wait(S1);
            wait(lock);
            wait(S3);
            //临界区1

            signal(lock);
            signal(S2);
            signal(S4);
        }
    }

    P1'(){
        while(true){
            wait(S1);
            wait(lock);
            wait(S3);
            //临界区1'

            signal(lock);
            signal(S2);
            signal(S4);
        }
    }

    P2(){
        while(true){
            wait(S2);
            wait(lock);
            wait(S4);
            //临界区2

            signal(lock);
            signal(S1);
            signal(S3);
        }
    }

    P2'(){
        while(true){
            wait(S2);
            wait(lock);
            wait(S4);
            //临界区2'

            signal(lock);
            signal(S1);
            signal(S3);
        }
    }