📅  最后修改于: 2023-12-03 15:12:41.845000             🧑  作者: Mango
这道问题出自于计算机科学与工程门类的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);
}
}